Android VideoView 检测视频即将完成

Android VideoView detect video is soon finish

我想知道电影是不是离结尾只有一分钟了。 所以,我使用下面的代码来检测。但是,播放器已挂起,无法执行任何操作。 有人可以更正我的代码吗?谢谢!

public Runnable mPlayToEnd = new Runnable() {
    public void run() {
        while(true)
        {
            if(mVideoDisplayView.getDuration() - mVideoDisplayView.getCurrentPosition() <= 1000 * 60)
            {
                   Intent intent = new Intent(WILL_END);  
                   sendBroadcast(intent);
                   mSendEndEvent = false;
                   Log.d("123","--Duration = " + mVideoDisplayView.getDuration() + "--");
                   Log.d("123","--Current = " + mVideoDisplayView.getCurrentPosition() + "--");
                   Log.d("123","--Soon End--");
            }
        }
    }
};
     Handler mCheckEndHandler = new Handler();
     mCheckEndHandler.post(mPlayToEnd);

它挂起是因为你有一个永远不会中断的无限 while(true) 循环,它会尝试 运行 全速检查你是否距离结束还有 1 分钟。你可以做的是定期检查,例如。每 1 秒,然后进行相应处理,因此您的代码可能看起来像:

public Runnable mPlayToEnd = new Runnable() {
    @Override
    public void run() {
        if (mmVideoDisplayView.getDuration() - mVideoDisplayView.getCurrentPosition() <= 1000 * 60) {
            Intent intent = new Intent(WILL_END);  
            sendBroadcast(intent);
            mSendEndEvent = false;
            Log.d("123","--Duration = " + mVideoDisplayView.getDuration() + "--");
            Log.d("123","--Current = " + mVideoDisplayView.getCurrentPosition() + "--");
            Log.d("123","--Soon End--");
        }
        else {
            mCheckEndHandler.postDelayed(mPlayToEnd, 1000);
        }
    }
}

然后将您的处理程序声明为 class 成员变量,以便它可以在您的 运行nable 中访问,然后启动它:

mCheckEndHandler = new Handler();
mCheckEndHandler.post(mPlayToEnd);

你的 运行nable 会检查条件,如果满足,它会发送广播,否则,它会在 1 秒(1000 毫秒)后再次 运行 自己。整个过程不断重复,直到您的条件为真。