首页 文章

MediaController - 调用Show()时出错

提问于
浏览
4

我有这个代码用于显示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
            ....
            ....
     };

我的logcat:

07-27 11:03:07.365:E / AndroidRuntime(328):FATAL EXCEPTION: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:无法添加窗口 - 令牌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):at 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:E / AndroidRuntime(328):在android.os.Handler . dispatchMessage(Handler.java:99)07-27 11:03:07.365:E / AndroidRuntime(328):at android.os.Looper.loop(Looper.java:123)07-27 11:03:07.365:E / AndroidRuntime(328):在android.app.ActivityThread.main(ActivityThread.java:3683)07-27 11:03:07.365:E / AndroidRuntime(328):at java.lang.reflect.Method.invokeNative(Native Method) 07-27 11:03:07.365:E / AndroidRuntime(328):at java.lang.reflect.Method.invoke(Method.java:507)07-27 11:03:07.365:E / AndroidRuntime(328):at com.and roid.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)07-27 11:03:07.365:E / AndroidRuntime(328):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java :597)07-27 11:03:07.365:E / AndroidRuntime(328):at dalvik.system.NativeStart.main(Native Method)07-27 11:03:07.365:E / AndroidRuntime(328):引起: android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null无效;你的活动在运行吗? 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):at 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 / AndroidRuntime(328):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)07-27 11:03:07.365:E / AndroidRuntime(328):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 1611)07-27 11:03:07.365:E / AndroidRuntime(328):... 11更多

我的代码有什么问题?

4 回答

  • 3

    我需要将MediaController显示给已经运行的MediaPlayer,所以我无法像e_v_e那样设置OnPreparedListener .

    回答这个问题:Can't fix MediaController.show() exception我发现在调用所有活动生命周期方法之前调用了show方法 . 建议的解决方案(设置延迟显示)有效,但为了避免延迟,您可以将show放在onAttachedToWindow方法中,该方法在所有活动生命周期方法之后调用 .

  • 0

    使用此方法 .

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
       super.onWindowFocusChanged(hasFocus);
       if(mediaController != null)
          mediaController.show(0);
    }
    
  • 0

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

    Summary

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

    • OnCreate . 的setContentView .

    • onStart . 创建MediaPlayer和MediaController,使用setOnPreparedListener启动侦听器并调用MediaPlayer的prepare()方法 .

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

    My code

    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;
        }
    } }
    
  • 1

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

    mediaController.show(0);
    

    因为它在 onCreate() 中调用并且应用程序仍未激活 . 简单的尝试,添加底部,点击时调用 mediaController.show(0); ,应用程序工作完美 .

    所以现在我必须在应用程序激活后调用此行 . 我试过onStart()和onResume(),但它没有用 . 同样的错误logCat .

    我该如何解决?

相关问题