android–MediaPlayer MediaController服务

android–MediaPlayer MediaController服务,第1张

概述我似乎无法解决这个问题:android.view.WindowManager$BadTokenException:无法添加窗口–令牌null无效;你的活动在运行吗?我有一个应用程序,它有一个托管片段的活动,它有一个MediaController.该活动绑定到托管媒体播放器的服务.我想要做的是从活动A开始播放一首歌,展示mediacontro

我似乎无法解决这个问题:

android.vIEw.WindowManager $BadTokenException:无法添加窗口 – 令牌null无效;你的活动在运行吗?

我有一个应用程序,它有一个托管片段的活动,它有一个MediaController.该活动绑定到托管媒体播放器的服务.我想要做的是从活动A开始播放一首歌,展示mediacontroller.然后离开活动A并输入活动B重新连接到服务,如果音频仍在播放,则在活动B中显示MediaController.无论我做什么,我都会不断收到错误.活动A和B只是相同活动的不同实例.如果您需要查看任何其他代码,请告诉我们.

 private ServiceConnection callConnection = new ServiceConnection() {    @OverrIDe    public voID onServiceConnected( Componentname name, IBinder service ) {        Log.d("LEAKTEST", "Connected to instance " + this.toString());        AudioService.MusicBinder binder = ( AudioService.MusicBinder ) service;        callService = binder.getService();        callService.setPreparedCallback( SpecIEsDetailsFragment.this );        callService.setList( callList );        callService.setSpecIEsID( getSpecIEsID() );        if ( callService.isPng() ) {            setController();            showController();        }        musicBound = true;    }    @OverrIDe    public voID onServicedisconnected( Componentname name ) {        musicBound = false;    }};private voID setController() {    if ( controller == null ) {        controller = new CallController( getActivity() );    }    controller.setPrevNextListeners( new VIEw.OnClickListener() {        @OverrIDe        public voID onClick( VIEw v ) {            playNext();        }    }, new VIEw.OnClickListener() {        @OverrIDe        public voID onClick( VIEw v ) {            playPrev();        }    } );    controller.setMediaPlayer( this );    controller.setAnchorVIEw( rootVIEw );}private voID showController(){    controller.show(0);    controller.setEnabled( true );}   @OverrIDepublic voID onPause() {    controller.hIDe();    loadingDialog.hIDe();    super.onPause();}@OverrIDepublic voID onStop() {    controller.hIDe();    controller = null;    // Unbind from the service    if ( musicBound ) {        getActivity().unbindService( callConnection );        musicBound = false;    }    super.onStop();}

完整Stacktrace:

06-03 19:38:11.986  17417-17417/com.myname.appname.core E/AndroIDRuntime﹕ FATAL EXCEPTION: mainProcess: com.myname.appname.core, PID: 17417androID.vIEw.WindowManager$BadTokenException: Unable to add window -- token null is not valID; is your activity running?        at androID.vIEw.VIEwRootImpl.setVIEw(VIEwRootImpl.java:536)        at androID.vIEw.WindowManagerGlobal.addVIEw(WindowManagerGlobal.java:259)        at androID.vIEw.WindowManagerImpl.addVIEw(WindowManagerImpl.java:69)        at androID.Widget.MediaController.show(MediaController.java:346)        at com.myname.appname.core.details.SpecIEsDetailsFragment.showController(SpecIEsDetailsFragment.java:354)        at com.myname.appname.core.details.SpecIEsDetailsFragment.access0(SpecIEsDetailsFragment.java:49)        at com.myname.appname.core.details.SpecIEsDetailsFragment.onServiceConnected(SpecIEsDetailsFragment.java:382)        at androID.app.LoadedApk$Servicedispatcher.doConnected(LoadedApk.java:1117)        at androID.app.LoadedApk$Servicedispatcher$runconnection.run(LoadedApk.java:1134)        at androID.os.Handler.handleCallback(Handler.java:733)        at androID.os.Handler.dispatchMessage(Handler.java:95)        at androID.os.Looper.loop(Looper.java:136)        at androID.app.ActivityThread.main(ActivityThread.java:5144)        at java.lang.reflect.Method.invokeNative(Native Method)        at java.lang.reflect.Method.invoke(Method.java:515)        at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)        at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:611)        at dalvik.system.NativeStart.main(Native Method)

谢谢,
弥敦道

解决方法:

根据调用堆栈,showController()方法在不适当的时间被调用 – 在Fragment准备好之前,或者在它被拆除之后.

对于第一种情况,您应该检查您从Fragment类调用bindService()的位置. onActivityCreated()将是最好的地方,因为它意味着Activity已经完全准备好了. Fragment的构造函数或类似的地方无法正常工作.

对于第二种情况,您应该确保在Fragment被拆除时到达的任何onServiceConnected()都不会导致问题.最简单的方法可能是在onStop()中设置一个标志,并在尝试显示控制器之前检查它.

顺便说一下,您似乎将片段对象传递给服务:

callService.setPreparedCallback(SpecIEsDetailsFragment.this);

那不是个好主意.服务和UI组件(如片段)具有完全独立的生命周期.这可能与问题有关,或者没有,但我建议你尝试以不同的方式做到这一点.

总结

以上是内存溢出为你收集整理的android – MediaPlayer MediaController服务全部内容,希望文章能够帮你解决android – MediaPlayer MediaController服务所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1117981.html

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

发表评论

登录后才能评论

评论列表(0条)

保存