【问题标题】:how to avoid black screen when activity is busy for start playing video from server如何在活动繁忙时避免黑屏以开始从服务器播放视频
【发布时间】:2013-02-16 21:54:05
【问题描述】:

我在单击按钮时打开一个活动,如果我单击按钮,下一个活动是从服务器播放视频,它发生黑色,5-6 秒后开始播放视频,如何避免黑屏。?

这是我的代码:

mPreview=new SurfaceView(getApplicationContext()); 
l1.addView(mPreview); 
holder = mPreview.getHolder(); 
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
extras = getIntent().getExtras(); 

以下内容为表面混凝土法。

        path = "http://www.pixintro.com/upload/video/Benetton.mp4";
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory()+"/Benetton.mp4");
        mMediaPlayer.setDataSource(path);
        mMediaPlayer.setDisplay(holder);
        mMediaPlayer.prepare();
        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

public void onPrepared(MediaPlayer mediaplayer){
       mIsVideoReadyToBePlayed = true;
       if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown){
               holder.setFixedSize(mVideoWidth, mVideoHeight);
               mMediaPlayer.start();
       }
}

【问题讨论】:

  • 可以添加onPrepared(MediaPlayer mp) 代码吗?

标签: android android-mediaplayer


【解决方案1】:

看看this接口。它包含媒体准备好播放时的回调。

MediaPlayer 也有一个 prepareAsync 方法。阅读this了解更多详情

【讨论】:

    【解决方案2】:

    您可以使用 async task 。在 doInBackground() 中进行处理时,即在后台。您可以显示一个进度对话框(onPreExecute()),一旦任务完成(onPostExecute)就会关闭。

    public class DisplayActivity extends Activity {
         @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_screen);
              // create surface view etc
                  new Operation().execute();
    }
    
    
    
    }
    
     private class Operation extends AsyncTask<String, Void, String> {
    
        @Override
        protected String doInBackground(String... params) {
        // code to be executed in background thread 
    
        for(int i=0;i<5;i++) {
        try {
        Thread.sleep(1000);
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        }
    
        return "Executed";
        } 
    
        @Override
        protected void onPostExecute(String result) {
        // runs on UI thread and updated UI after executing doInBackground
        progressDialog.dismiss();
        }
    
        @Override
        protected void onPreExecute() {
        ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "Title ", "Loading...");
        progressDialog.show();
    
        }
    
        @Override
        protected void onProgressUpdate(Void... values) {
        // runs on UI thread and starts first
    
        }
        } 
    

    【讨论】:

    • 从后台任务播放视频是否正确?因为我需要为视频创建表面视图并将在后台执行,所以我可以将表面视图添加到活动中
    • 可以在我们activity的oncreate()中添加view,然后调用这个类new Operation().execute();从 craete 开始。在这里您可以在后台准备和缓冲您的媒体播放器。在视频准备好之前,将显示一个进度对话框。
    • 感谢您的帮助。我正在尝试更改代码并将结果显示给您
    • 它没有正常工作,因为我点击按钮,它在那里停留了 2 秒,然后进入下一个屏幕,并且进度稳定,没有任何动作,视频在几秒后开始播放。 protected String doInBackground(String... params) { holder = mPreview.getHolder(); holder.addCallback(MediaPlayerDemo_Video.this);返回“执行”; }
    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多