Add error msg provider

pull/594/head
jhengazuki 3 months ago
parent c4b78a2164
commit 9acb3a85b5
  1. 2
      app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java
  2. 5
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  3. 74
      app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java
  4. 20
      app/src/main/java/com/fongmi/android/tv/player/exo/TrackNameProvider.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java
  6. 44
      app/src/main/res/values-zh-rCN/error.xml
  7. 3
      app/src/main/res/values-zh-rCN/strings.xml
  8. 44
      app/src/main/res/values-zh-rTW/error.xml
  9. 3
      app/src/main/res/values-zh-rTW/strings.xml
  10. 44
      app/src/main/res/values/error.xml
  11. 3
      app/src/main/res/values/strings.xml

@ -56,7 +56,7 @@ public class ErrorEvent {
public String getMsg() {
if (type == Type.URL) return ResUtil.getString(R.string.error_play_url);
if (type == Type.DRM) return ResUtil.getString(R.string.error_play_drm_scheme);
if (type == Type.DRM) return ResUtil.getString(R.string.error_play_drm);
if (type == Type.FLAG) return ResUtil.getString(R.string.error_play_flag);
if (type == Type.PARSE) return ResUtil.getString(R.string.error_play_parse);
if (type == Type.TIMEOUT) return ResUtil.getString(R.string.error_play_timeout);

@ -48,6 +48,7 @@ import com.fongmi.android.tv.impl.ParseCallback;
import com.fongmi.android.tv.impl.SessionCallback;
import com.fongmi.android.tv.player.danmaku.DanPlayer;
import com.fongmi.android.tv.player.exo.CacheManager;
import com.fongmi.android.tv.player.exo.ErrorMsgProvider;
import com.fongmi.android.tv.player.exo.ExoUtil;
import com.fongmi.android.tv.server.Server;
import com.fongmi.android.tv.utils.FileUtil;
@ -77,6 +78,7 @@ public class Players implements Player.Listener, ParseCallback {
public static final int SOFT = 0;
public static final int HARD = 1;
private final ErrorMsgProvider provider;
private final AudioManager audioManager;
private final StringBuilder builder;
private final Formatter formatter;
@ -110,6 +112,7 @@ public class Players implements Player.Listener, ParseCallback {
private Players(Activity activity) {
decode = Setting.getDecode();
builder = new StringBuilder();
provider = new ErrorMsgProvider();
runnable = () -> ErrorEvent.timeout(tag);
formatter = new Formatter(builder, Locale.getDefault());
audioManager = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
@ -673,7 +676,7 @@ public class Players implements Player.Listener, ParseCallback {
@Override
public void onPlayerError(@NonNull PlaybackException error) {
Logger.t(TAG).e(error.errorCode + "," + url);
if (retried()) ErrorEvent.extract(tag, error.getErrorCodeName());
if (retried()) ErrorEvent.extract(tag, provider.get(error));
else switch (error.errorCode) {
case PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW:
seekToDefaultPosition();

@ -0,0 +1,74 @@
package com.fongmi.android.tv.player.exo;
import android.content.res.Resources;
import androidx.media3.common.PlaybackException;
import androidx.media3.exoplayer.mediacodec.MediaCodecRenderer;
import androidx.media3.exoplayer.mediacodec.MediaCodecUtil;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
public class ErrorMsgProvider {
private final Resources resources;
public ErrorMsgProvider() {
this.resources = App.get().getResources();
}
public String get(PlaybackException e) {
if (e.getCause() instanceof MediaCodecRenderer.DecoderInitializationException e2) return custom(e2);
return resources.getString(getId(e.errorCode));
}
private String custom(MediaCodecRenderer.DecoderInitializationException e) {
if (e.codecInfo != null) return resources.getString(R.string.error_instantiating_decoder, e.codecInfo.name);
if (e.getCause() instanceof MediaCodecUtil.DecoderQueryException) return resources.getString(R.string.error_querying_decoders);
else if (e.secureDecoderRequired) return resources.getString(R.string.error_no_secure_decoder, e.mimeType);
else return resources.getString(R.string.error_no_decoder, e.mimeType);
}
private int getId(int errorCode) {
return switch (errorCode) {
case PlaybackException.ERROR_CODE_REMOTE_ERROR -> R.string.error_remote_error;
case PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW -> R.string.error_behind_live_window;
case PlaybackException.ERROR_CODE_TIMEOUT -> R.string.error_timeout;
case PlaybackException.ERROR_CODE_FAILED_RUNTIME_CHECK -> R.string.error_failed_runtime_check;
case PlaybackException.ERROR_CODE_IO_UNSPECIFIED -> R.string.error_io_unspecified;
case PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED -> R.string.error_io_network_connection_failed;
case PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT -> R.string.error_io_network_connection_timeout;
case PlaybackException.ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE -> R.string.error_io_invalid_http_content_type;
case PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> R.string.error_io_bad_http_status;
case PlaybackException.ERROR_CODE_IO_FILE_NOT_FOUND -> R.string.error_io_file_not_found;
case PlaybackException.ERROR_CODE_IO_NO_PERMISSION -> R.string.error_io_no_permission;
case PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED -> R.string.error_io_cleartext_not_permitted;
case PlaybackException.ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE -> R.string.error_io_read_position_out_of_range;
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED -> R.string.error_parsing_container_malformed;
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED -> R.string.error_parsing_manifest_malformed;
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED -> R.string.error_parsing_container_unsupported;
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED -> R.string.error_parsing_manifest_unsupported;
case PlaybackException.ERROR_CODE_DECODER_INIT_FAILED -> R.string.error_decoder_init_failed;
case PlaybackException.ERROR_CODE_DECODER_QUERY_FAILED -> R.string.error_decoder_query_failed;
case PlaybackException.ERROR_CODE_DECODING_FAILED -> R.string.error_decoding_failed;
case PlaybackException.ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES -> R.string.error_decoding_format_exceeds_capabilities;
case PlaybackException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED -> R.string.error_decoding_format_unsupported;
case PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED -> R.string.error_decoding_resources_reclaimed;
case PlaybackException.ERROR_CODE_AUDIO_TRACK_INIT_FAILED -> R.string.error_audio_track_init_failed;
case PlaybackException.ERROR_CODE_AUDIO_TRACK_WRITE_FAILED -> R.string.error_audio_track_write_failed;
case PlaybackException.ERROR_CODE_AUDIO_TRACK_OFFLOAD_WRITE_FAILED -> R.string.error_audio_track_offload_write_failed;
case PlaybackException.ERROR_CODE_AUDIO_TRACK_OFFLOAD_INIT_FAILED -> R.string.error_audio_track_offload_init_failed;
case PlaybackException.ERROR_CODE_DRM_UNSPECIFIED -> R.string.error_drm_unspecified;
case PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED -> R.string.error_drm_provisioning_failed;
case PlaybackException.ERROR_CODE_DRM_CONTENT_ERROR -> R.string.error_drm_content_error;
case PlaybackException.ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED -> R.string.error_drm_license_acquisition_failed;
case PlaybackException.ERROR_CODE_DRM_DISALLOWED_OPERATION -> R.string.error_drm_disallowed_operation;
case PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR -> R.string.error_drm_system_error;
case PlaybackException.ERROR_CODE_DRM_DEVICE_REVOKED -> R.string.error_drm_device_revoked;
case PlaybackException.ERROR_CODE_DRM_LICENSE_EXPIRED -> R.string.error_drm_license_expired;
case PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSOR_INIT_FAILED -> R.string.error_video_frame_processor_init_failed;
case PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED -> R.string.error_video_frame_processing_failed;
default -> R.string.error_unspecified;
};
}
}

@ -54,19 +54,13 @@ public class TrackNameProvider {
private String buildAudioChannelString(Format format) {
int channelCount = format.channelCount;
if (channelCount < 1) return "";
switch (channelCount) {
case 1:
return resources.getString(R.string.exo_track_mono);
case 2:
return resources.getString(R.string.exo_track_stereo);
case 6:
case 7:
return resources.getString(R.string.exo_track_surround_5_point_1);
case 8:
return resources.getString(R.string.exo_track_surround_7_point_1);
default:
return resources.getString(R.string.exo_track_surround);
}
return switch (channelCount) {
case 1 -> resources.getString(R.string.exo_track_mono);
case 2 -> resources.getString(R.string.exo_track_stereo);
case 6, 7 -> resources.getString(R.string.exo_track_surround_5_point_1);
case 8 -> resources.getString(R.string.exo_track_surround_7_point_1);
default -> resources.getString(R.string.exo_track_surround);
};
}
private String buildLanguageOrLabelString(Format format) {

@ -72,7 +72,7 @@ public class TVBus implements Source.Extractor, Listener {
private String check() throws Exception {
if (hls == null) return "";
if (!hls.startsWith("-")) return hls;
throw new ExtractException(ResUtil.getString(R.string.error_play_code, hls));
throw new ExtractException(ResUtil.getString(R.string.error_play_url));
}
@Override

@ -0,0 +1,44 @@
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
<string name="error_unspecified">发生未预期的错误</string>
<string name="error_remote_error">发生远程错误</string>
<string name="error_behind_live_window">已落后直播流过多</string>
<string name="error_timeout">操作超时</string>
<string name="error_failed_runtime_check">发生内部播放器错误</string>
<string name="error_io_unspecified">发生未知的 I/O 错误</string>
<string name="error_io_network_connection_failed">网络连接失败</string>
<string name="error_io_network_connection_timeout">网络连接超时</string>
<string name="error_io_invalid_http_content_type">无效的服务器响应</string>
<string name="error_io_bad_http_status">无法连接至服务器</string>
<string name="error_io_file_not_found">找不到文件</string>
<string name="error_io_no_permission">I/O 权限不足</string>
<string name="error_io_cleartext_not_permitted">此内容需要安全的网络连接</string>
<string name="error_io_read_position_out_of_range">读取源数据失败</string>
<string name="error_parsing_container_malformed">媒体文件已损坏或格式不受支持</string>
<string name="error_parsing_manifest_malformed">流清单无效</string>
<string name="error_parsing_container_unsupported">不支持此媒体容器格式</string>
<string name="error_parsing_manifest_unsupported">不支持此流清单格式</string>
<string name="error_decoder_init_failed">初始化媒体解码器失败</string>
<string name="error_decoder_query_failed">找不到适合此格式的媒体解码器</string>
<string name="error_decoding_failed">解码媒体时发生错误</string>
<string name="error_decoding_format_exceeds_capabilities">媒体画质超过设备能力上限</string>
<string name="error_decoding_format_unsupported">此设备不支持该媒体格式</string>
<string name="error_decoding_resources_reclaimed">解码资源已被系统回收</string>
<string name="error_audio_track_init_failed">初始化音轨失败</string>
<string name="error_audio_track_write_failed">写入音频数据失败</string>
<string name="error_audio_track_offload_write_failed">写入 Offload 音频数据失败</string>
<string name="error_audio_track_offload_init_failed">初始化 Offload 音轨失败</string>
<string name="error_drm_unspecified">发生未知的 DRM 错误</string>
<string name="error_drm_provisioning_failed">设置设备 DRM 失败</string>
<string name="error_drm_content_error">受保护的内容发生错误</string>
<string name="error_drm_license_acquisition_failed">获取内容授权失败</string>
<string name="error_drm_disallowed_operation">不允许此 DRM 操作</string>
<string name="error_drm_system_error">发生 DRM 系统错误</string>
<string name="error_drm_device_revoked">此设备的内容访问权已被撤销</string>
<string name="error_drm_license_expired">内容授权已过期</string>
<string name="error_video_frame_processor_init_failed">初始化视频帧处理器失败</string>
<string name="error_video_frame_processing_failed">处理视频帧时发生错误</string>
<string name="error_no_decoder">此设备未提供 <xliff:g id="mime_type">%1$s</xliff:g> 格式的解码器</string>
<string name="error_no_secure_decoder">此设备未提供 <xliff:g id="mime_type">%1$s</xliff:g> 格式的安全解码器</string>
<string name="error_querying_decoders">无法查询设备的解码器</string>
<string name="error_instantiating_decoder">无法将解码器 <xliff:g id="decoder_name">%1$s</xliff:g> 实例化</string>
</resources>

@ -124,8 +124,7 @@
<string name="error_play_next">已经是最后一集了!</string>
<string name="error_play_prev">已经是第一集了!</string>
<string name="error_play_parse">播放地址解析失败</string>
<string name="error_play_drm_scheme">此设备不支持所需的 DRM scheme</string>
<string name="error_play_code">错误代码:<xliff:g name="name">%s</xliff:g></string>
<string name="error_play_drm">此设备不支持所需的 DRM scheme</string>
<string name="error_play_url">播放地址加载失败</string>
<string name="error_play_flag">暂无线路数据</string>
<string name="error_play_timeout">连接超时</string>

@ -0,0 +1,44 @@
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
<string name="error_unspecified">發生未預期的錯誤</string>
<string name="error_remote_error">發生遠端錯誤</string>
<string name="error_behind_live_window">已落後直播串流過多</string>
<string name="error_timeout">操作逾時</string>
<string name="error_failed_runtime_check">發生內部播放器錯誤</string>
<string name="error_io_unspecified">發生未知的 I/O 錯誤</string>
<string name="error_io_network_connection_failed">網路連線失敗</string>
<string name="error_io_network_connection_timeout">網路連線逾時</string>
<string name="error_io_invalid_http_content_type">無效的伺服器回應</string>
<string name="error_io_bad_http_status">無法連接至伺服器</string>
<string name="error_io_file_not_found">找不到檔案</string>
<string name="error_io_no_permission">I/O 權限不足</string>
<string name="error_io_cleartext_not_permitted">此內容需要安全的網路連線</string>
<string name="error_io_read_position_out_of_range">讀取來源資料失敗</string>
<string name="error_parsing_container_malformed">媒體檔案已損毀或格式不受支援</string>
<string name="error_parsing_manifest_malformed">串流清單無效</string>
<string name="error_parsing_container_unsupported">不支援此媒體容器格式</string>
<string name="error_parsing_manifest_unsupported">不支援此串流清單格式</string>
<string name="error_decoder_init_failed">初始化媒體解碼器失敗</string>
<string name="error_decoder_query_failed">找不到適合此格式的媒體解碼器</string>
<string name="error_decoding_failed">解碼媒體時發生錯誤</string>
<string name="error_decoding_format_exceeds_capabilities">媒體品質超過裝置能力上限</string>
<string name="error_decoding_format_unsupported">此裝置不支援該媒體格式</string>
<string name="error_decoding_resources_reclaimed">解碼資源已被系統收回</string>
<string name="error_audio_track_init_failed">初始化音軌失敗</string>
<string name="error_audio_track_write_failed">寫入音訊資料失敗</string>
<string name="error_audio_track_offload_write_failed">寫入 Offload 音訊資料失敗</string>
<string name="error_audio_track_offload_init_failed">初始化 Offload 音軌失敗</string>
<string name="error_drm_unspecified">發生未知的 DRM 錯誤</string>
<string name="error_drm_provisioning_failed">設定裝置 DRM 失敗</string>
<string name="error_drm_content_error">受保護的內容發生錯誤</string>
<string name="error_drm_license_acquisition_failed">取得內容授權失敗</string>
<string name="error_drm_disallowed_operation">不允許此 DRM 操作</string>
<string name="error_drm_system_error">發生 DRM 系統錯誤</string>
<string name="error_drm_device_revoked">此裝置的內容存取權已被撤銷</string>
<string name="error_drm_license_expired">內容授權已過期</string>
<string name="error_video_frame_processor_init_failed">初始化影片影格處理器失敗</string>
<string name="error_video_frame_processing_failed">處理影片影格時發生錯誤</string>
<string name="error_no_decoder">此裝置未提供 <xliff:g id="mime_type">%1$s</xliff:g> 格式的解碼器</string>
<string name="error_no_secure_decoder">此裝置未提供 <xliff:g id="mime_type">%1$s</xliff:g> 格式的安全解碼器</string>
<string name="error_querying_decoders">無法查詢裝置的解碼器</string>
<string name="error_instantiating_decoder">無法將解碼器 <xliff:g id="decoder_name">%1$s</xliff:g> 實例化</string>
</resources>

@ -124,8 +124,7 @@
<string name="error_play_next">已經是最後一集了!</string>
<string name="error_play_prev">已經是第一集了!</string>
<string name="error_play_parse">播放網址解析失敗</string>
<string name="error_play_drm_scheme">本設備不支援所需的 DRM scheme</string>
<string name="error_play_code">錯誤代碼:<xliff:g name="name">%s</xliff:g></string>
<string name="error_play_drm">本設備不支援所需的 DRM scheme</string>
<string name="error_play_url">播放網址載入失敗</string>
<string name="error_play_flag">暫無線路資料</string>
<string name="error_play_timeout">連線逾時</string>

@ -0,0 +1,44 @@
<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">
<string name="error_unspecified">An unexpected error occurred</string>
<string name="error_remote_error">A remote error occurred</string>
<string name="error_behind_live_window">Fell too far behind the live stream</string>
<string name="error_timeout">The operation timed out</string>
<string name="error_failed_runtime_check">An internal player error occurred</string>
<string name="error_io_unspecified">An unknown I/O error occurred</string>
<string name="error_io_network_connection_failed">Network connection failed</string>
<string name="error_io_network_connection_timeout">Network connection timed out</string>
<string name="error_io_invalid_http_content_type">Invalid server response</string>
<string name="error_io_bad_http_status">Unable to connect to the server</string>
<string name="error_io_file_not_found">File not found</string>
<string name="error_io_no_permission">I/O permission denied</string>
<string name="error_io_cleartext_not_permitted">A secure connection is required for this content</string>
<string name="error_io_read_position_out_of_range">Failed to read data from the source</string>
<string name="error_parsing_container_malformed">The media file is corrupted or in an unsupported format</string>
<string name="error_parsing_manifest_malformed">The stream manifest is invalid</string>
<string name="error_parsing_container_unsupported">The media container format is not supported</string>
<string name="error_parsing_manifest_unsupported">The stream manifest format is not supported</string>
<string name="error_decoder_init_failed">Failed to initialize the media decoder</string>
<string name="error_decoder_query_failed">Failed to find a suitable media decoder for the format</string>
<string name="error_decoding_failed">An error occurred while decoding the media</string>
<string name="error_decoding_format_exceeds_capabilities">The media quality exceeds the device\'s capabilities</string>
<string name="error_decoding_format_unsupported">The media format is not supported by this device</string>
<string name="error_decoding_resources_reclaimed">Decoding resources were reclaimed by the system</string>
<string name="error_audio_track_init_failed">Failed to initialize the audio track</string>
<string name="error_audio_track_write_failed">Failed to write audio data</string>
<string name="error_audio_track_offload_write_failed">Failed to write offloaded audio data</string>
<string name="error_audio_track_offload_init_failed">Failed to initialize the offloaded audio track</string>
<string name="error_drm_unspecified">An unknown DRM error occurred</string>
<string name="error_drm_provisioning_failed">Failed to configure DRM on this device</string>
<string name="error_drm_content_error">An error occurred with the protected content</string>
<string name="error_drm_license_acquisition_failed">Failed to acquire the content license</string>
<string name="error_drm_disallowed_operation">The requested DRM operation is not allowed</string>
<string name="error_drm_system_error">A DRM system error occurred</string>
<string name="error_drm_device_revoked">Access to this content has been revoked for this device</string>
<string name="error_drm_license_expired">The content license has expired</string>
<string name="error_video_frame_processor_init_failed">Failed to initialize the video frame processor</string>
<string name="error_video_frame_processing_failed">An error occurred while processing a video frame</string>
<string name="error_no_decoder">This device does not provide a decoder for <xliff:g id="mime_type">%1$s</xliff:g></string>
<string name="error_no_secure_decoder">This device does not provide a secure decoder for <xliff:g id="mime_type">%1$s</xliff:g></string>
<string name="error_querying_decoders">Unable to query device decoders</string>
<string name="error_instantiating_decoder">Unable to instantiate decoder <xliff:g id="decoder_name">%1$s</xliff:g></string>
</resources>

@ -125,8 +125,7 @@
<string name="error_play_next">It\'s the last episode!</string>
<string name="error_play_prev">It\'s the first episode!</string>
<string name="error_play_parse">Unable to parse url</string>
<string name="error_play_drm_scheme">This device does not support the required DRM scheme</string>
<string name="error_play_code">Error code: <xliff:g name="name">%s</xliff:g></string>
<string name="error_play_drm">This device does not support the required DRM scheme</string>
<string name="error_play_url">Unable to load url</string>
<string name="error_play_flag">No flag data</string>
<string name="error_play_timeout">Timed out</string>

Loading…
Cancel
Save