¿Cómo evitar que VideoView / MediaPlayer detenga el audio de otras aplicaciones?
En una pantalla tengo un video de fondo de bucle (sobre el cual se muestran los elementos de interfaz de usuario normales), implementado con VideoView como esto:
String resPath = "android.resource://" + getPackageName() + "/" + R.raw.bg_video; videoView.setVideoURI(Uri.parse(resPath)); // Hide controls: MediaController controller = new MediaController(getActivity()); controller.setVisibility(View.GONE); videoView.setMediaController(controller); // Use looping: videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setLooping(true); } }); videoView.start();
El video funciona muy bien. El único problema es que cuando se muestra esta vista (o incluso antes si se utiliza, por ejemplo, ViewPager), la reproducción de música de otras aplicaciones se detiene .
- Compartir enlace de audio de terceros en la nube de sonido y youtube en la aplicación Android
- El vídeo / audio de Cordova no se reproducirá desde cdvfile: // urls después de la actualización a 3.3.0
- Android: Clase AudioRecord Problema: La devolución de llamada nunca se llama
- AudioTrack lag: obtenerBuffer tiempo de espera agotado
- Decodificación de extracto de Android para codificar audio Mux
El video que estoy usando no tiene sonido. ¿Hay una manera de configurar el VideoView, o el MediaPlayer que utiliza, en un "modo silenciado"? Es decir, no decir que no hacer el audio en absoluto, y sobre todo no meterse con el audio de otras aplicaciones .
Probado mp.setVolume(0, 0);
in onPrepared()
pero no tiene efecto.
- Reproducir sonido a un auricular y grabar desde el micrófono del altavoz
- Cómo obtener una lista de reproductores multimedia instalados
- Concatenar dos archivos de audio y reproducir el archivo resultante
- Bajar o atenuar el sonido en android
- ¿Cómo puedo transferir el búfer de audio para reproducirlo directamente
- Audio Framework: flujo, estrategias, dispositivos
- Android: ¿Por qué el constructor de SoundPool está obsoleto?
- Cómo proporcionar datos de audio y datos de vídeo a MediaMux
Copie la pasta VideoView
desde fuentes de Android y comente estas líneas:
AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
Por ejemplo, podría nombrar a la nueva clase MutedVideoView
.
La solución aceptada no garantiza la compatibilidad entre todas las versiones de Android y es un hack sucio más que una verdadera solución. He intentado todas las formas de hacks para conseguir este trabajo, pero ninguno ha funcionado a mi satisfacción.
He llegado con una solución mucho mejor sin embargo – cambiar de un VideoView
a un TextureView
y cargar con un MediaPlayer
. No hay diferencia desde la perspectiva del usuario, simplemente no hay detención de audio.
Aquí está mi caso de uso para jugar un bucle MP4:
private TextureView _introVideoTextureView; private MediaPlayer _introMediaPlayer; ... @Override public void onCreate(...) { _introVideoTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { try { destoryIntroVideo(); _introMediaPlayer = MediaPlayer.create(SignInActivity.this, R.raw.intro_video); _introMediaPlayer.setSurface(new Surface(surfaceTexture)); _introMediaPlayer.setLooping(true); _introMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); _introMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); } catch (Exception e) { System.err.println("Error playing intro video: " + e.getMessage()); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {} @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {} }); } @Override public void onDestroy() { super.onDestroy(); destoryIntroVideo(); } private void destoryIntroVideo() { if (_introMediaPlayer != null) { _introMediaPlayer.stop(); _introMediaPlayer.release(); _introMediaPlayer = null; } }