gpt4 book ai didi

android - MediaPlayer 媒体 Controller 服务

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:26 25 4
gpt4 key购买 nike

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

android.view.WindowManager$BadTokenException: 无法添加窗口 -- token null 无效;你的 Activity 在运行吗?

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

 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 );
}

@Override
public void onPause() {
controller.hide();
loadingDialog.hide();
super.onPause();
}

@Override
public void onStop() {
controller.hide();
controller = null;
// Unbind from the service
if ( musicBound ) {
getActivity().unbindService( callConnection );
musicBound = false;
}
super.onStop();
}

完整的堆栈跟踪:

06-03 19:38:11.986  17417-17417/com.myname.appname.core E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myname.appname.core, PID: 17417
android.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.access$700(SpeciesDetailsFragment.java:49)
at com.myname.appname.core.details.SpeciesDetailsFragment$6.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() 中设置一个标志并在尝试显示 Controller 之前检查它。

顺便说一句,您似乎正在将 fragment 对象传递给服务:

callService.setPreparedCallback(SpeciesDetailsFragment.this);

这不是个好主意。服务和 UI 组件(例如 fragment )具有完全独立的生命周期。这可能与问题有关,也可能无关,但我建议您尝试以不同的方式执行此操作。

关于android - MediaPlayer 媒体 Controller 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com