Java 崩溃日志:MediaPlayer.setSubtitleAnchor中存在内部错误

Java 崩溃日志:MediaPlayer.setSubtitleAnchor中存在内部错误,java,android,crash-reports,Java,Android,Crash Reports,经常会看到以下崩溃日志弹出: 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.scanInte

经常会看到以下崩溃日志弹出:

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。使用上下文/资源参数创建
。它对我和95%的用户都很好。有一件事需要注意的是,我确实感到害怕

 E/MediaPlayer: Should have subtitle controller already set

日志消息是许多问题的主题。我目前一直在忽略它,就像大多数答案告诉我的那样-但是如果
scanInternalSubtitleTracks
正在创建内部错误崩溃,也许我不应该?

在媒体播放器android中,在媒体准备好后,播放器开始搜索字幕,在搜索字幕发送而不是崩溃期间发生任何异常。 你应该忽略它,或者你可以使用其他玩家,比如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上的问题

实际上,这应该是一个警告,因为mediaplayer在播放时总是查找附加到媒体的任何字幕,如果不存在,则抛出内部错误。您可以通过播放带有字幕的媒体文件(音频/视频)或将虚拟字幕附加到您的文件来验证此行为。我也只希望看到警告,但此堆栈跟踪显示在我的Android应用程序在播放控制台中记录的“崩溃”下。我的文件只是音频…但我会尝试添加一个虚拟字幕。说得清楚一点,你是说即使这个异常出现在Play Console的“崩溃日志”中,但实际上并没有导致客户设备崩溃?是的,这是真的。这是由android处理的,只是作为崩溃发送给你的carshlytic。嗯,根据这个页面,如果android停止应用程序,它应该只算作“崩溃”。或者我读错了吗?不,你们并没有,但那个并没有崩溃。android将异常处理为RuntimeException并将消息返回给你们。我将这部分代码添加到答案中