2013-07-27 22 views
4

我有這段代碼來顯示MediaController,但是當我調用Show()方法時,它給了我一個致命錯誤。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):致命異常:主要 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無效;你的活動正在運行? E/AndroidRuntime(328):at/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):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931) 07-27 11:03:07.365:E/AndroidRuntime(328):at 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.android.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):at android.view.ViewRoot.setView(ViewRoot.java:527) 07-27 11:03:07.365:E/AndroidRuntime(328):at 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):at 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):。 ..更多

我的代碼有什麼問題?

+0

有人請!!! – BTob

回答

0

好的,這麼好,我找到了答案。 問題是在該行:

mediaController.show(0); 

因爲它onCreate()調用,應用程序還沒有啓動。 簡單的嘗試,添加底部,點擊時調用mediaController.show(0);,並且應用程序工作完美。

所以現在我必須在應用激活後調用這一行。 我試過onStart()和onResume(),它不工作。相同的錯誤logCat。

我該如何解決?

1

我得到了同樣的問題,並在幾個小時後得到解決方案。我做了以下內容:

摘要

Activity類實現的接口:MediaPlayer.OnPreparedListener和MediaController.MediaPlayerControl

  • OnCreate中。的setContentView。

  • onStart。創建MediaPlayer和MediaController,使用setOnPreparedListener啓動監聽器,並調用MediaPlayer的prepare()方法。

  • 實現方法onPrepared。將mediaController與mediaPlayer鏈接起來,啓動mediaPlayer,只有當我們知道mediaPlayer已準備就緒時,這裏就是使用處理程序調用方法show()的地方。

我的代碼

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

我需要將MediaController展現給一個已經運行的MediaPlayer,所以我不能設置像OnPreparedListener說e_v_e。

隨着這個問題的答案:Can't fix MediaController.show() exception我發現在調用所有活動生命週期方法之前調用show方法。在那裏提出的解決方案(設置延遲顯示)有效,但爲了避免延遲,您可以將顯示放在onAttachedToWindow方法中,該方法在所有活動生命週期方法之後調用。

3

使用此方法。

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