onCompletion(mp: MediaPlayer?)

问题描述 投票:0回答:1

我正在制作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>)
}
android kotlin usb android-mediaplayer
1个回答
0
投票

没有足够的信息来完全调试,但我想我可以为您指明正确的方向。查看 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
回调。

© www.soinside.com 2019 - 2024. All rights reserved.