android – 无法修复MediaController.show()异常

android – 无法修复MediaController.show()异常,第1张

概述我有一个音频文件播放在前台服务使用MediaPlayer.当用户点击与前台服务相关联的通知时,我使用Intent启动一个Activity,如下所示: Intent audioPlayIntent = new Intent(context, AudioPlayActivity.class);audioPlayIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_T 我有一个@R_419_6756@播放在前台服务使用MediaPlayer.当用户点击与前台服务相关联的通知时,我使用Intent启动一个Activity,如下所示:
Intent audioPlayIntent = new Intent(context,AudioPlayActivity.class);audioPlayIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_top);audioPlayIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent contentIntent = PendingIntent.getActivity(context,audioPlayIntent,0);

然后,此活动将绑定到服务以向用户显示MediaController.

以下是服务中的绑定代码:

public class AudioPlayerServiceBinder extends Binder{    public AudioPlayerService getAudioService(){        return AudioPlayerService.this; //this class is declared in AudioPlayerService.java,so it has access to the Service instance.    }}

..和在Activity的onStart中我有一个调用这个方法:

private voID bindAudioService()    {        Intent i = new Intent(this,AudioPlayerService.class);        serviceConnection = new AudioServiceConnection();        bindService(i,serviceConnection,0);    }

我在mediaController.show(5000)行下面得到一个例外:

private class AudioServiceConnection implements ServiceConnection{    AudioPlayerServiceBinder audioServiceBinder;@OverrIDe        public voID onServiceConnected(Componentname name,IBinder serviceBinder)        {            serviceConnected = true;            Log.i(TAG,"Connected to audio player service.");            audioServiceBinder = ((AudioPlayerServiceBinder) serviceBinder);            AudioPlayActivity.this.audioService = audioServiceBinder.getAudioService();            mediaController.show(5000);        }

例外是:

androID.vIEw.WindowManager$BadTokenException: Unable to add window -- token null is not valID; is your activity running?at androID.vIEw.VIEwRoot.setVIEw(VIEwRoot.java:527)at androID.vIEw.WindowManagerImpl.addVIEw(WindowManagerImpl.java:177)at androID.vIEw.WindowManagerImpl.addVIEw(WindowManagerImpl.java:91)at androID.vIEw.Window$LocalWindowManager.addVIEw(Window.java:424)at androID.Widget.MediaController.show(MediaController.java:304)at androID.Widget.MediaController.show(MediaController.java:249)at com.myapp.AudioPlayActivity$AudioServiceConnection.onServiceConnected(AudioPlayActivity.java:295)

我可以重新创建相同的例外:

>点击通知打开活动
>按回来关闭活动.
>单击通知以打开新版本的活动.

这导致我相信媒体控制器以某种方式泄漏,并尝试在原始的Activity实例中显示.我找不到任何理由,因为mediaController在Activity的onCreate()中被实例化,并且只绑定到活动本身. (活动然后处理传递命令到服务).

解决方法 在以前的活动完成生命周期之前,我认为你正在调用show()太早.可以通过延迟调用show()直到调用所有生命周期方法来避免BadTokenException.您可以为此发布延迟的可执行文件.或者你可以试试以下,
if (!((Activity)your_context).isFinishing()) {    mediaController.show(5000);}
总结

以上是内存溢出为你收集整理的android – 无法修复MediaController.show()异常全部内容,希望文章能够帮你解决android – 无法修复MediaController.show()异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1131679.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存