Android原生媒体播放器没有触发onCompletion方法

时间:2014-10-30 10:06:39

标签: android video listener

原生Android Media播放器在视频运行它的持续时间后不会调用onCompletion方法。

我有一个播放单个视频或视频列表的活动(m3u8文件)。视频播放文件应该是,我也可以使用媒体控制器,但是,当视频用完时,几秒后他就开始循环。除非用户点击(或双击)媒体控制器上的快进选项,否则onCompletion方法不会激活。

当视频用完时,有没有办法让onComplete方法自动激活? (我已经尝试过使用听众,但是没有工作)。指出我做错了也行不通。

以下是处理视频播放的活动:

public class VideoActivity extends ActionBarActivity implements MediaPlayer.OnCompletionListener {
    private static final String TAG = VideoActivity.class.getSimpleName();

    private VideoView mVideoViewStream1;
    ProgressDialog mDialog;
    private String mURL;
    private ChannelPlaylist mChannelPlaylist;
    private int mIndex;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        // Validate internet connection
        if (!Util.isDeviceConnected(this)) {
            FragmentManager fm = getSupportFragmentManager();
            PopUpErrorFragment popupError = PopUpErrorFragment.newInstance(getString(R.string.errorInternetConnection));
            popupError.show(fm, PopUpErrorFragment.TAG);
            finish();
        }

        // Assign controls to their variable representations
        mVideoViewStream1 = (VideoView) findViewById(R.id.vvVideo);

        // Retrieve bundle data
        Intent i = getIntent();
        Bundle bundle = i.getExtras();
        ChannelPlaylist channelPlaylist = bundle.getParcelable(KeyHelper.BUNDLE_CHANNEL_PLAYLIST);

        if (channelPlaylist != null) {
            this.mChannelPlaylist = channelPlaylist;
            if (bundle.containsKey("index") && mIndex == 0) {
                this.mIndex = bundle.getInt("index");
            } else {
                if (this.mIndex == 0) {
                    this.mIndex = this.mChannelPlaylist.getIndex();
                }
            }

            this.mURL = this.mChannelPlaylist.getSchedule().get(mIndex).getStream_url();
        } else {
            this.mURL = bundle.getString("url");
        }

        progressDialog();
        standardAndroidPlayer();
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.video, menu);
        return true;
    }



    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }



    /***************************** CLASS METHODS **************************************************/



    /**
     * Dismissess the dialog
     */
    private void dismissDialog() {
        if (this.mDialog != null) {
            mDialog.dismiss();
        }
    }



    /**
     * Standard android player
     */
    private void standardAndroidPlayer() {
        try {
            // Start the MediaController
            MediaController mediacontroller = new MediaController(this);
            mediacontroller.setAnchorView(mVideoViewStream1);

            // Get the URL from String VideoURL
            mVideoViewStream1.setMediaController(mediacontroller);
            // Set media player completion listener
            mVideoViewStream1.setOnCompletionListener(this);

            mVideoViewStream1.setVideoURI(Uri.parse(this.mURL));
            mVideoViewStream1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    //Log.i(TAG, "Duration = " + mVideoViewStream1.getDuration());
                    if (mp.isLooping()) mp.setLooping(false);

                }
            });
            mVideoViewStream1.requestFocus();
            mVideoViewStream1.start();
        } catch (Exception e) {
            dismissDialog();
            Log.e(TAG, "Error" + e.getMessage());
            e.printStackTrace();

        }

        dismissDialog();
    }



    @Override
    public void onCompletion(MediaPlayer mp) {
        this.mIndex++;
        if (this.mIndex < mChannelPlaylist.getSchedule().size()) {
            this.mURL = this.mChannelPlaylist.getSchedule().get(this.mIndex).getStream_url();
            standardAndroidPlayer();
        } else {
            finish();
        }
    }



    /**
     * Creates a progress dialog
     */
    private void progressDialog() {
        // Create a progressbar
        mDialog = new ProgressDialog(VideoActivity.this);
        // Set progressbar title
        mDialog.setTitle("Android Video Streaming Tutorial");
        // Set progressbar message
        mDialog.setMessage("Buffering...");
        mDialog.setIndeterminate(false);
        mDialog.setCancelable(false);
        // Show progressbar
        mDialog.show();
    }
}

编辑: 好吧,由于一些奇怪的原因,在手机上这种方法并没有开火,但是当在平板电脑上使用时,确实如此。我无法在平板电脑上重现效果,也没有在手机上取得任何成功。它与android的版本有关吗?由于在撰写听众时我没有收到关于兼容性的任何警告,我对此并没有太多考虑。

1 个答案:

答案 0 :(得分:0)

试试这个。

   mVideoViewStream1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {

                finish();
            }
        });