2013-07-27 2 views
4

У меня есть этот код для отображения MediaController, но он дает мне фатальную ошибку, когда я вызываю метод Show().MediaController - Ошибка при вызове Show()

Сам MediaPlayer работает над сервисом и получает намерение от интерфейса MediaPlayerControl.

Мой код:

@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 ИСКЛЮЧЕНИЕ: главный 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): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1647) 07-27 11: 03: 07.365: E/AndroidRuntime (328): at 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): у 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): at android.app.ActivityThread.main (ActivityThread.java:3683) 07-27 11: 03: 07.365: E/AndroidRuntime (328): at java.lang.reflect.Method.invokeNative (собственный метод) 07-27 11: 03: 07.365: E/AndroidRuntime (328): в 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): Caused by: 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): at 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):. .. 11 еще

В чем проблема с моим кодом?

+0

Кто-то пожалуйста !!! – BTob

ответ

0

Хорошо, так что я нашел ответ. Проблема заключается в строке:

mediaController.show(0); 

Потому что называется в onCreate() и приложение еще не активирована. Простая попытка, добавьте нижнюю, что вызов mediaController.show(0);, когда он щелкнул, и приложение работает идеально.

Так что теперь я должен позвонить в эту строку после активации приложения. Я пробовал onStart() и onResume(), и он не работает. Такая же ошибка logCat.

Как это исправить?

1

У меня такая же проблема, и через несколько часов вышло решение. Я сделал следующее:

Резюме:

Класс активности реализует интерфейсы: MediaPlayer.OnPreparedListener и MediaController.MediaPlayerControl

  • OnCreate. setContentView.

  • onStart. Создайте MediaPlayer и MediaController, запустите слушатель с помощью метода setOnPreparedListener и метода prepare() метода MediaPlayer.

  • Внедрить метод на подготовленный. Свяжите mediaController с медиапланером, запустите 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; 
    } 
} } 
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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^