我正在制作Android应用程序,显示从USB存储盘复制的内容。
问题是当USB存储光盘连接到设备时,媒体播放器
onCompletion()
立即被调用,尽管现在的电影尚未播放完毕。
我想解决这个问题,以便在连接 USB 时不调用
onCompletion()
。
提前致谢。
class PlayerViewModel(application: Application, repository: GCSRepository) : ViewModel(), USBDownloadListener,
MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
override fun onDownloadFinished(unusedFiles: MutableSet<String>) {
// some codes here...
}
override fun onCompletion(mp: MediaPlayer?) {
// some codes here...
}
}
class USBIOManager(context: Context) {
init {
registerReceiver(context)
}
private fun registerReceiver(context: Context) {
unRegisterReceiver(context)
mUsbReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// some codes here...
updateUSBFiles(context)
// some codes here...
}
}
}
private fun updateUSBFiles(context: Context) {
// some codes here...
downloadListener?.onDownloadFinished(existingInternalStorageFiles)
// some codes here...
}
interface USBDownloadListener {
fun onDownloadFinished(unusedFiles : MutableSet<String>)
}
没有足够的信息来完全调试,但我想我可以为您指明正确的方向。查看 MediaPlayer 的源代码可以看出,
OnComplete
回调不仅在 MEDIA_PLAYBACK_COMPLETE
上被调用
case MEDIA_PLAYBACK_COMPLETE:
if (mOnCompletionListener != null)
mOnCompletionListener.onCompletion(mMediaPlayer);
stayAwake(false);
return;
但如果未设置错误侦听器,也会在
MEDIA_ERROR
上
case MEDIA_ERROR:
Log.e(TAG, "Error (" + msg.arg1 + "," + msg.arg2 + ")");
boolean error_was_handled = false;
if (mOnErrorListener != null) {
error_was_handled = mOnErrorListener.onError(mMediaPlayer, msg.arg1, msg.arg2);
}
if (mOnCompletionListener != null && ! error_was_handled) {
mOnCompletionListener.onCompletion(mMediaPlayer);
}
stayAwake(false);
return;
一般情况下,某些播放控制操作可能会因各种原因而失败,例如音视频格式不支持、音视频交错不良、分辨率过高、串流超时等。因此,在这些情况下,错误报告和恢复是一个重要的问题。有时,由于编程错误,也可能会出现在无效状态下调用播放控制操作的情况。
MediaPlayer 不是线程安全的。玩家实例的创建和所有访问都应该在同一线程上。如果注册回调,线程必须有Looper 文档
可能与您使用
MediaPlayer
的方式有关,当您连接 USB 时可能会触发错误,如果未设置 onComplete
,则会触发 OnErrorListener
回调。