android - Android 4.0 及以上版本的视频观看问题

标签 android android-videoview

我正在尝试从流式 URL 播放视频。代码如下

public class VideoPlayer extends Activity  
{
    private VideoView mVideoView;            
    String videoURL="";
    static Utility utility;
    static Context context;
    MediaController mediaController;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {         
        super.onCreate(savedInstanceState);
        setContentView(R.layout.video_player);          
        setupViews();
    }

    private void setupViews() 
    {
        context=VideoPlayer.this;
        utility=new Utility(VideoPlayer.this);
        isActivityisRunning=true;
        showProgressDialog("Loading video..");
        videoURL=getIntent().getExtras().getString("url");            
        mVideoView=(VideoView)findViewById(R.id.video_view);
        mediaController=new MediaController(context);            
        mVideoView.setMediaController(mediaController);

        mVideoView.setOnPreparedListener(new OnPreparedListener() 
        {
            @Override
            public void onPrepared(MediaPlayer mp) 
            {
                hideProgressDialog();

                if(bIsOnPausedCalled)
                    mVideoView.seekTo(LastDuration);
                    mVideoView.start();                     
                    mVideoView.requestFocus();  
                    bIsOnPausedCalled=false;
                    LastDuration=0;
                }
            });

           mVideoView.setOnCompletionListener(new OnCompletionListener() 
            {

                @Override
                public void onCompletion(MediaPlayer mp) 
                {
                    finish();
                }
            }); 


           mVideoView.setOnErrorListener(new OnErrorListener() 
           {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) 
            {
                utility.hideProgressDialog();
                return false;
            }
        });

           playVideoFile();      
        } 

    public static void showDialog(String Message)
    {       
                alertDialog = new AlertDialog.Builder(context).create();  
                alertDialog.setTitle(Constant.DialogTitle);  
                alertDialog.setMessage(Message);  
                alertDialog.setCancelable(false);
                alertDialog.setButton("Ok", new DialogInterface.OnClickListener() 
                {  
                          public void onClick(DialogInterface dialog, int which) 
                          {             
                             dialog.dismiss();                          
                          } 
                }); 
                if(isActivityisRunning)
                    alertDialog.show();
                else
                    utility.showToast(Message);
    }

    static ProgressDialog progressDialog;
    static AlertDialog alertDialog;

    public  void showProgressDialog(String Message)
    {   
            hideProgressDialog();
            progressDialog=new ProgressDialog(context);
            progressDialog.setTitle(Constant.DialogTitle);
            progressDialog.setMessage(Message);                         
            if(isActivityisRunning)
                progressDialog.show();
            else
                utility.showToast(Message);
    }

    public static boolean isActivityisRunning;
    public static boolean showProgressDialog;


    public static boolean bIsOnPausedCalled=false;
    public static int LastDuration=0;

        @Override
        protected void onPause() 
        {   

            hideProgressDialog();
            bIsOnPausedCalled=true;
            isActivityisRunning=false;
            if (mVideoView != null)
            {       
                if(LastDuration==0)
                {
                    LastDuration=mVideoView.getCurrentPosition();
                    mVideoView.suspend();
                    mVideoView.setVisibility(View.GONE);    
                }               
            }
            super.onPause();
        }

        @Override
        protected void onResume() 
        {

            isActivityisRunning=true;
                if(bIsOnPausedCalled)
                {                       
                    setupViews();               
                }
                super.onResume();       
        }

        @Override
        protected void onDestroy() 
        {
            super.onDestroy();
            try 
            {               
                if (mVideoView != null) 
                {   
                    mVideoView.stopPlayback();
                    mVideoView=null;                
                    hideProgressDialog();
                    isActivityisRunning=false;
                     bIsOnPausedCalled=false;
                     LastDuration=0;
                }

            } catch (Exception e) 
            {}              
        }


    public static void hideProgressDialog()
    {
        if(progressDialog!=null)
        {
            if(progressDialog.isShowing())
            {
                progressDialog.dismiss();
            }           
        }
    }


    private void playVideoFile() 
        {

                try 
                {                   
                    mVideoView.setVideoURI(Uri.parse(videoURL));
                }
                catch (Exception e) 
                {
                    utility.hideProgressDialog();
                    if (mVideoView != null) 
                    {                   
                        mVideoView.stopPlayback();
                    }
                }
            }   

这在版本低于 4.0 的 Android 设备上工作正常(使用 sleep 模式按钮暂停和恢复)。 但是当我尝试在具有 4.0 或更高版本的 Android 手机上播放视频时 视频可以正常播放,但是当手机进入休眠模式并从 sleep 模式恢复时 视频 View 大小变为屏幕的一半。如下enter image description here

请帮忙?

提前致谢......

最佳答案

你所做的一切都是正确的,但你已经应用了 setContentView(R.layout.video_player); 只有一个,即使视频已恢复。 所以代码应该是

@Override
public void onCreate(Bundle savedInstanceState) 
{         
    super.onCreate(savedInstanceState);                
    setupViews();
}

private void setupViews() 
{
    setContentView(R.layout.video_player);  
    context=VideoPlayer.this;
    -----
    ------
}

代替

@Override
public void onCreate(Bundle savedInstanceState) 
{         
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.video_player);       
    setupViews();
}

private void setupViews() 
{
    context=VideoPlayer.this;
    -----
    ------
}

关于android - Android 4.0 及以上版本的视频观看问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12072307/

相关文章:

android - onRequestPermissionsResult 在 HomeActivity 中调用但不在 Fragment 中调用

java - 如何使android studio代码中的两个 "intent"不同时处理?

java - 我在 Android Studio 上以 XML 形式实现了卡片 View 。我怎样才能把它当作按钮呢?

android - 在Android :的VideoView或MediaPlayer上方显示半透明覆盖

Android Vitamio 对渐进式下载流的缓冲感到奇怪

android - 使用 MediaRecorder 录制屏幕特定 View

android - 当我点击我的 apk 文件并显示修改或删除您的 USB 存储的内容时,安装按钮显示为禁用

java - 如何在android中的视频 View 上显示音量搜索栏?

android - RecyclerView 上的 VideoView

android - vimeo android 的直接链接