4

В одном из моих приложений для Android есть WebView, который отображает веб-страницу проигрывателя GrooveShark. Когда пользователь нажимает кнопку воспроизведения на веб-странице, активность автоматически запускает медиаплеер по умолчанию, который воспроизводит дорожку. Все работает нормально, проблема возникает, когда пользователь закрывает это действие и MediaPlayer, хотя он больше не воспроизводит дорожку, остается в живых ... даже когда приложение закрыто, MediaPlayer все еще жив. Единственный способ убить его - это заставить приложение остановиться ... Я не очень большой, но на некоторых устройствах, когда пользователь зависает после телефонного звонка, этот «зомби» MediaPlayer внезапно начинает играть трек, даже если приложение уже было ранее уничтожено ...Остановить Android MediaPlayer, автоматически запущенный на веб-странице в WebView

Это резюме кода моей деятельности:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_song); 

    myWV = (WebView) findViewById(R.id.webview); 

    WebSettings webSettings = myWV.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 

    myWV.setWebViewClient(new MyWebViewClient()); 
    myWV.setWebChromeClient(new WebChromeClient()); 
    myWV.loadUrl(url); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    myWV.onPause(); 
    myWV.pauseTimers(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    myWV.onResume(); 
    myWV.resumeTimers(); 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    myWV.destroy(); 
} 

private class MyWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 

     if (Uri.parse(url).getHost().equals("grooveshark.com")) { 
      return false; 
     } 

     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
     startActivity(intent); 

     return true; 
    } 
} 

И это , что журнал показывает, когда воспроизводится дорожка в первый раз:

12-03 20:52:13.184: D/webkit(23440): euler: isUrlBlocked = false 
12-03 20:52:13.794: V/MediaPlayer(23440): constructor 
12-03 20:52:13.804: V/MediaPlayer(23440): setListener 
12-03 20:52:13.814: D/HTML5Audio(23440): setDataSource() 
12-03 20:52:13.894: V/MediaPlayer(23440): setVideoSurfaceTexture 
12-03 20:52:13.894: V/MediaPlayer(23440): prepareAsync 
12-03 20:52:16.144: V/MediaPlayer(23440): message received msg=3, ext1=12, ext2=0 
12-03 20:52:16.154: V/MediaPlayer(23440): buffering 12 
12-03 20:52:16.154: V/MediaPlayer(23440): callback application 
12-03 20:52:16.154: V/MediaPlayer(23440): back from callback 
12-03 20:52:16.154: V/MediaPlayer(23440): message received msg=5, ext1=0, ext2=0 
12-03 20:52:16.154: V/MediaPlayer(23440): New video size 0 x 0 
12-03 20:52:16.154: V/MediaPlayer(23440): callback application 
12-03 20:52:16.154: V/MediaPlayer(23440): back from callback 
12-03 20:52:16.154: V/MediaPlayer(23440): message received msg=1, ext1=0, ext2=0 
12-03 20:52:16.154: V/MediaPlayer(23440): prepared 
12-03 20:52:16.154: V/MediaPlayer(23440): callback application 
12-03 20:52:16.154: V/MediaPlayer(23440): back from callback 
12-03 20:52:16.184: E/MediaPlayer(23440): mOnVideoSizeChangedListener is null. Failed to send MEDIA_SET_VIDEO_SIZE message. 
12-03 20:52:16.194: I/MediaPlayer(23440): Don't send intent. msg.arg1 = 0, msg.arg2 = 0 
12-03 20:52:16.194: I/MediaPlayer(23440): mOnPreparedListener. Send MEDIA_PREPARED message. 
12-03 20:52:16.194: D/HTML5Audio(23440): onPrepared() 
12-03 20:52:16.214: V/MediaPlayer(23440): getDuration 
12-03 20:52:16.224: V/MediaPlayer(23440): seekTo 0 
12-03 20:52:16.224: V/MediaPlayer(23440): getDuration 
12-03 20:52:16.224: V/MediaPlayer(23440): message received msg=4, ext1=0, ext2=0 
12-03 20:52:16.224: D/HTML5Audio(23440): play() called. mState = 2 
12-03 20:52:16.224: V/MediaPlayer(23440): Received seek complete 
12-03 20:52:16.224: V/MediaPlayer(23440): All seeks complete - return to regularly  scheduled program 
12-03 20:52:16.224: V/MediaPlayer(23440): callback application 
12-03 20:52:16.224: V/MediaPlayer(23440): back from callback 
12-03 20:52:16.244: V/MediaPlayer(23440): start 
12-03 20:52:16.264: D/HTML5Audio(23440): play() - start() 
12-03 20:52:16.284: I/MediaPlayer(23440): mOnSeekCompleteListener. Send MEDIA_SEEK_COMPLETE message. 
12-03 20:52:16.464: V/MediaPlayer(23440): isPlaying: 1 
12-03 20:52:16.714: V/MediaPlayer(23440): isPlaying: 1 
.... 

И, наконец, это , что журнал продолжает показывать навсегда когда активность закончила

12-03 20:52:36.164: V/MediaPlayer(23440): message received msg=3, ext1=100, ext2=0 
12-03 20:52:36.164: V/MediaPlayer(23440): buffering 100 
12-03 20:52:36.164: V/MediaPlayer(23440): callback application 
12-03 20:52:36.164: V/MediaPlayer(23440): back from callback 
12-03 20:52:36.244: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:36.494: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:36.744: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:36.994: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:37.164: V/MediaPlayer(23440): message received msg=3, ext1=100, ext2=0 
12-03 20:52:37.164: V/MediaPlayer(23440): buffering 100 
12-03 20:52:37.164: V/MediaPlayer(23440): callback application 
12-03 20:52:37.164: V/MediaPlayer(23440): back from callback 
12-03 20:52:37.244: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:37.504: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:37.754: V/MediaPlayer(23440): isPlaying: 0 
12-03 20:52:38.004: V/MediaPlayer(23440): isPlaying: 0 
.... 

Мне нужно найти способ получить, что «зомби» MediaPlayer и остановить его ...

Большое спасибо

+1

Вы когда-нибудь находили решение этой проблемы? Я столкнулся с аналогичной проблемой с видео в моем веб-обзоре. –

+0

Ничего ... Тем не менее я попробовал свое приложение в устройствах Xperia и HTC, и эта проблема не возникает ... в тех устройствах, которые зомби «MediaPlayer Service» умирает, когда работает WebView. Кажется, это ошибка некоторых конкретных устройств Samsung (например, Samsung Galaxy Trend (4.0.4)), и я не думаю, что это связано с уровнем API ... Единственный способ остановить это - убить приложение, когда вы закрываете it: Process.killProcess (Process.myPid()); – Hannibalem

+0

Я также попытался извлечь pid этого процесса MediaPlayer и убить его с помощью команды, которую я опубликовал ранее ... но ничего, Android не позволяет мне убить ее ... действительно раздражает. – Hannibalem

ответ

8

После борьбы с аналогичным issue я наконец нашел решение. Похоже, что если AudioService не имеет фокуса при закрытии Webview, он не приостанавливается. Это вызывает severals вопросы (еще один игрок не может начать играть и т.д.)

Единственное решение, которое работало для меня:

@Override 
protected void onPause() { 
    super.onPause(); 

    ((AudioManager)getSystemService(
      Context.AUDIO_SERVICE)).requestAudioFocus(
        new OnAudioFocusChangeListener() { 
         @Override 
         public void onAudioFocusChange(int focusChange) {} 
        }, AudioManager.STREAM_MUSIC, 
        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 

} 

Это приведет к тому, текущий игрок будет приостановлена ​​/ убит (не уверен, какой), когда спуститься и решить все мои проблемы/проблемы. Надеюсь, это тоже поможет ...

+2

Человек-гений! Ваше решение не убивает услугу «MediaPlayer» зомби, когда закрывает WebView, но, по крайней мере, устройство больше не ведет себя странно, и оно не воспроизводит песню после разговора или после воспроизведения видео на YouTube ... спасибо человеку! – Hannibalem