MediaController - Ошибка при вызове Show ()

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

Сам MediaPlayer работает над Service и получает Intent из интерфейса 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
            ....
            ....
     };

мой логарифм:

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

Воспользуйтесь этим методом.


person m-schwob    schedule 27.07.2013    source источник


Ответы (5)


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

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

Резюме:

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

OnCreate. setContentView.

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

  • Реализуйте метод 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;
    }
} }
person e_v_e    schedule 02.03.2014

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

mediaController.show(0);

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

Как я могу это исправить?

Мне нужно было показать MediaController уже работающему MediaPlayer, поэтому я не мог установить OnPreparedListener, как сказал e_v_e.

person m-schwob    schedule 05.08.2013

С ответом на этот вопрос: Не могу исправить исключение MediaController.show () I обнаружил, что метод show вызывается до вызова всех методов жизненного цикла действия. Предлагаемое там решение (установка задержки для показа) работает, но, чтобы избежать задержки, вы можете поместить показ внутри метода onAttachedToWindow, который вызывается после всех методов жизненного цикла активности.

Просто поместите mediaPlayer.prepare () и mediaPlayer.start () в поток, такой как обработчик или AsyncTask, и готово. Если вы используете kotlin и anko lib, вы можете поместить их в doAsync {}.

person jonathanrz    schedule 05.09.2014

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: невозможно добавить окно - нулевой токен недействителен; ваша деятельность идет? 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: E / AndroidRuntime (328): в android.os.Handler. dispatchMessage (Handler.java:99) 07-27 11: 03: 07.365: E / AndroidRuntime (328): на 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): в 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 / Andr oidRuntime (328): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839) 07-27 11: 03: 07.365: E / AndroidRuntime (328): в com.android.internal.os .ZygoteInit.main (ZygoteInit.java:597) 07-27 11: 03: 07.365: E / AndroidRuntime (328): в dalvik.system.NativeStart.main (собственный метод) 07-27 11: 03: 07.365: E / AndroidRuntime (328): вызвано: android.view.WindowManager $ BadTokenException: невозможно добавить окно - нулевой токен недействителен; ваша деятельность идет? 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): на 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

person Hossein Yousefpour    schedule 07.09.2019