5

我有这段代码用于显示 MediaController,但是当我调用 Show() 方法时它给了我一个致命错误。

MediaPlayer 本身在 Service 上工作并从 MediaPlayerControl 接口获取 Intent。

我的代码:

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

            mediaController =  new MediaController(this, false);
            mediaController.setMediaPlayer(mediaPlayerControl);
            mediaController.setAnchorView(findViewById(R.id.mediaController));
            mediaController.setEnabled(true);
            mediaController.show(0);
    }

    //implements MediaPlayerControl interface
    private MediaPlayerControl mediaPlayerControl = new MediaPlayerControl()
    {

            //Override the methods to send Intent to the MediaPlayer Service
            ....
            ....
     };

我的日志猫:

07-27 11:03:07.365: E/AndroidRuntime(328): 致命异常: main 07-27 11:03:07.365: E/AndroidRuntime(328): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com. example.radius100fm/com.example.radius100fm.MainActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token null 无效;您的活动正在运行吗?07-27 11:03:07.365: E/AndroidRuntime(328): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 07-27 11:03:07.365: E/AndroidRuntime(328): 在 android. app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 07-27 11:03:07.365: E/AndroidRuntime(328): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117) 07-27 11:03 :07.365: E/AndroidRuntime(328): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 07-27 11:03:07.365: 引起:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid;您的活动正在运行吗?07-27 11:03:07.365: E/AndroidRuntime(328): 在 android.view.ViewRoot.setView(ViewRoot.java:527) 07-27 11:03:07.365: E/AndroidRuntime(328): 在 android. view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 07-27 11:03:07.365: E/AndroidRuntime(328): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 07-27 11:03: 07.365: E/AndroidRuntime(328): 在 android.view.Window$LocalWindowManager.addView(Window.java:424) 07-27 11:03:07.365: E/AndroidRuntime(328): 在 android.widget.MediaController.show (MediaController.java:304) 07-27 11:03:07.365: E/AndroidRuntime(328): at com.example.radius100fm.MainActivity.onCreate(MainActivity.java:100) 07-27 11:03:07.365: E /Android 运行时(328):

我的代码有什么问题?

4

5 回答 5

3

使用此方法。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   if(mediaController != null)
      mediaController.show(0);
}
于 2016-06-18T05:42:48.013 回答
1

我遇到了同样的问题,几个小时后得到了解决方案。我做了以下事情:

摘要

Activity 类实现接口:MediaPlayer.OnPreparedListener 和 MediaController.MediaPlayerControl

  • 创建时。设置内容视图。

  • 开始。创建MediaPlayer和MediaController,用setOnPreparedListener启动监听器,调用MediaPlayer的prepare()方法。

  • 实现方法onPrepared。将 mediaController 与 mediaPlayer 链接,启动 mediaPlayer,这里是使用处理程序调用方法 show() 的地方,只有当我们知道 mediaPlayer 准备好时。

我的代码

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaController.MediaPlayerControl {

private static final String TAG = "AudioPlayer";

private MediaPlayer mediaPlayer;

private MediaController mediaController;

private Handler handler = new Handler();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


}

@Override
protected void onStart() {
    Log.d(TAG, "Play - onStart");
    super.onStart();

    mediaPlayer = new MediaPlayer();
    mediaController = new MediaController(this);

    mediaPlayer.setOnPreparedListener(this);

    try {
        AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(R.raw.audio_example);
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());

        mediaPlayer.prepare();
        afd.close();
    } catch (IOException e) {
        Log.e(TAG, "Error opening audio: " + e.getCause());
    }

}

// override this method because of the OnPreparedListener interface

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    Log.d(TAG, "Play - onPrepared");
    mediaController.setMediaPlayer(this);
    mediaController.setAnchorView(findViewById(R.id.mediaController1));
    mediaPlayer.start();

    handler.post(new Runnable() {

        @Override
        public void run() {
            mediaController.setEnabled(true);
            mediaController.show(0);

        }
    });

}

    // override these methods because of the MediaController.MediaPlayerControl interface

@Override
public boolean canPause() {
    return true;
}

@Override
public boolean canSeekBackward() {
    return true;
}

@Override
public boolean canSeekForward() {
    return true;
}

@Override
public int getAudioSessionId() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public int getBufferPercentage() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public int getCurrentPosition() {
    return mediaPlayer.getCurrentPosition();
}

@Override
public int getDuration() {
    return mediaPlayer.getDuration();
}

@Override
public boolean isPlaying() {
    return mediaPlayer.isPlaying();
}

@Override
public void pause() {
    mediaPlayer.pause();
}

@Override
public void seekTo(int pos) {
    mediaPlayer.seekTo(pos);
}

@Override
public void start() {
    mediaPlayer.start();
}

    // release resources before kill the Activity

@Override
protected void onStop() {
    Log.d(TAG, "Play - onStop");
    super.onStop();
    if (mediaPlayer != null) {
        mediaController.hide();
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null;
    }
} }
于 2014-03-02T19:50:58.907 回答
0

我需要将 MediaController 显示给已经运行的 MediaPlayer,所以我不能像 e_v_e 所说的那样设置 OnPreparedListener。

有了这个问题的答案:无法修复 MediaController.show() 异常,我发现在调用所有活动生命周期方法之前调用了 show 方法。那里提出的解决方案(设置延迟显示)有效,但为了避免延迟,您可以将显示放在 onAttachedToWindow 方法中,该方法在所有活动生命周期方法之后调用。

于 2014-09-05T14:25:02.433 回答
0

好的,我找到了答案。问题在于:

mediaController.show(0);

因为它调用onCreate()了应用程序仍然没有激活。简单尝试,在点击时添加底部调用mediaController.show(0);,该应用程序运行完美。

所以现在我必须在应用程序激活后拨打这条线。我试过 onStart() 和 onResume() 但它不起作用。同样的错误logCat。

我该如何解决?

于 2013-08-05T21:17:25.573 回答
0

只需将mediaPlayer.prepare()mediaPlayer.start()放在像 handler 或 AsyncTask 这样的线程中并完成。如果你使用的是 kotlin 和 anko lib,你可以把它放在 doAsync {} 中。

于 2019-09-07T07:07:18.610 回答