журнал сбоев: InternalError в MediaPlayer.setSubtitleAnchor

Увидеть следующий аварийный журнал довольно часто:

java.lang.InternalError: 
  at java.lang.Thread.nativeCreate (Native Method)
  at java.lang.Thread.start (Thread.java:733)
  at android.media.MediaPlayer.setSubtitleAnchor (MediaPlayer.java:3039)
  at android.media.MediaPlayer.scanInternalSubtitleTracks (MediaPlayer.java:3240)
  at android.media.MediaPlayer.prepare (MediaPlayer.java:1442)
  at android.media.MediaPlayer.create (MediaPlayer.java:1046)
  at android.media.MediaPlayer.create (MediaPlayer.java:1012)
  ...

Я вызываю MediaPlayer.create с параметрами context/resource. Он отлично работает для меня и для 95% пользователей. Одно дело отметить, что я действительно получаю страшное

 E/MediaPlayer: Should have subtitle controller already set

сообщение журнала, которое является темой многих, многих вопросов StackOverflow. В настоящее время я игнорирую это, как и большинство ответов, - но если scanInternalSubtitleTracks создает сбой InternalError, возможно, я не должен?

Ответы

Ответ 1

в медиа-проигрывателе Android после MEDIA_PREPARED, начальный поиск субтитров проигрывателя и любое исключение происходит во время поиска отправки субтитров вместо сбоев. вы должны игнорировать его или использовать другого игрока, например, ExoPlayer.

case MEDIA_PREPARED:
    try {
         scanInternalSubtitleTracks();
    } catch (RuntimeException e) {
      // send error message instead of crashing;
      // send error message instead of inlining a call to onError
      // to avoid code duplication.
      Message msg2 = obtainMessage(
                        MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_UNSUPPORTED, null);
      sendMessage(msg2);
    }
    OnPreparedListener onPreparedListener = mOnPreparedListener;
    if (onPreparedListener != null)
         onPreparedListener.onPrepared(mMediaPlayer);
         return;

в android версии 28 android позволяют использовать .setOnSubtitleDataListener() которые могут решить вашу проблему на android 28