`

Android之SurfaceView窗口/全屏播放

阅读更多

package com.FJICC.lzm;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.app.AlertDialog;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;

public class multimedia_player2 extends Activity implements SurfaceHolder.Callback{

 
   private MediaPlayer mMediaPlayer01;
   private SurfaceView mSurfaceView01;
   private SurfaceHolder mSurfaceHolder01;
  

   private ImageButton mPlay;
   private ImageButton mPause;
   private ImageButton mReset;
   private ImageButton mStop;
  
   private boolean bIsPaused = false;
   private boolean bIsReleased = true;
   private boolean bIsReset = false;
   private String strVideoPath = "";
  
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.multimedia_player2);
  
  
  
  if(!checkSDCard())
     {
       /* 检测是否有SD卡*/
       mMakeTextToast
       (
         getResources().getText(R.string.str_err_nosd).toString(),
         true
       );
       };
      
      
       getWindow().setFormat(PixelFormat.UNKNOWN);
      
       /*获取用来显示视频SurfaceView */
       mSurfaceView01 = (SurfaceView) findViewById(R.id.surfaceView1);
      
      
      
       /* 获取SurfaceHolder控制 SurfaceView*/
       mSurfaceHolder01 = mSurfaceView01.getHolder();
       mSurfaceHolder01.addCallback(this);
      
       /*默认视频分辨率 176x144*/
       mSurfaceHolder01.setFixedSize(176,144);
       //设置.....
       mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      
       /*获取ImageButton的ID */
       mPlay = (ImageButton) findViewById(R.id.imageButton_start);
       mPause = (ImageButton) findViewById(R.id.imageButton_pause);
       mReset = (ImageButton) findViewById(R.id.imageButton_reset);
       mStop = (ImageButton) findViewById(R.id.imageButton_stop);
      
       mPlay.setEnabled(true);//初始状态 开启播放按钮,其他的设置为false
          mPause.setEnabled(false);
          mReset.setEnabled(false);
         
       /*测试用播放视频*/
 strVideoPath = "file:///sdcard/DCIM/test.mp4";
 
  mPlay.setOnClickListener(new ImageButton.OnClickListener()
     {
       public void onClick(View view)
       {
         /*启动Function */
         if(checkSDCard())
         {
          if(bIsReleased == true){
          showDialog(0);
          playVideo(strVideoPath);          
          }
          else if(bIsReset == true){
          // mMediaPlayer01.start();
           bIsReset = false;           
          }
          mPlay.setEnabled(false);
          mPause.setEnabled(true);
          mReset.setEnabled(true);
         }
       }
     });
    
     /*暂停 */
     mPause.setOnClickListener(new ImageButton.OnClickListener()
     {
       public void onClick(View view)
       {
         if(checkSDCard())
         {
           if (mMediaPlayer01 != null)
           {
             if(bIsReleased == false)
             {
               if(bIsPaused==false)
               {
                 mMediaPlayer01.pause();                
                 bIsPaused = true;
                 mMakeTextToast("pause",true);
                // mTextView01.setText(R.string.str_pause);
               }
               else if(bIsPaused==true)
               {
                 mMediaPlayer01.start();
                 bIsPaused = false;
                 mMakeTextToast("start",true);
                // mTextView01.setText(R.string.str_play);
               }
             }
           }
         }
       }
     });
    
     /*复位重播*/
     mReset.setOnClickListener(new ImageButton.OnClickListener()
     {
       public void onClick(View view)
       {
         if(checkSDCard())
         {
           if(bIsReleased == false)
           {
             if (mMediaPlayer01 != null)
             {
              
              mMediaPlayer01.seekTo(0);//回到录像原点
             //  如果是暂停状态回到原点,那么回到原点后还是暂停的,需要点击暂停键继续播放
              //如果是播放的时候,点击复位播放,那么复位后自动是自动播放的。
             }
           }
         }
       }
     });
    
     /*关闭播放*/
     mStop.setOnClickListener(new ImageButton.OnClickListener()
     {
       public void onClick(View view)
       {
         if(checkSDCard())
         {
           if (mMediaPlayer01 != null)
           {
             if(bIsReleased==false)
             {
               mMediaPlayer01.stop();
               mMediaPlayer01.release();
               bIsReleased = true;
            //  mMakeTextToast("["+mMediaPlayer01.toString()+"]",true);
              
               mPlay.setEnabled(true);//回到初始状态  :开启播放按钮,其他的设置为false
               mPause.setEnabled(false);
               mReset.setEnabled(false);
             }         
           }
          
         }
       }
     });
 } 
   /*播放视频函数*/
   private void playVideo(String strPath)
   {
  
    //DisplayMetircs 类可以很方便的获取分辨率     获取窗口的分辨率
    //这里获取窗口的大小
       DisplayMetrics metrics = new DisplayMetrics();
       getWindowManager().getDefaultDisplay().getMetrics(metrics);
      
     //设置Layout的参数 
     LayoutParams lp = mSurfaceView01.getLayoutParams();    
     lp.width = metrics.widthPixels/2;
     lp.height =metrics.heightPixels/2;
     mSurfaceView01.setLayoutParams(lp);
    
     mMediaPlayer01 = new MediaPlayer();
     mMediaPlayer01.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
    
     /* */
     mMediaPlayer01.setDisplay(mSurfaceHolder01); 
    
     try
     {
       mMediaPlayer01.setDataSource(strPath);
     }
     catch (Exception e)
     {
       // TODO Auto-generated catch block
       mMakeTextToast("setDataSource Exceeption:"+e.toString(),true);
      //mTextView01.setText("setDataSource Exceeption:"+e.toString());
       e.printStackTrace();
     }
    
     try
     {
       mMediaPlayer01.prepare();
     }
     catch (Exception e)
     {
       // TODO Auto-generated catch block
      mMakeTextToast("setDataSource Exceeption:"+e.toString(),true);
      //mTextView01.setText("prepare Exceeption:"+e.toString());
       e.printStackTrace();
     }
    
     mMediaPlayer01.start();
     bIsReleased = false;
     //mTextView01.setText(R.string.str_play);    
     mMediaPlayer01.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
     {
       @Override
       public void onCompletion(MediaPlayer arg0)
       {
         // TODO Auto-generated method stub
        mMakeTextToast("stop",true); 
       //  mTextView01.setText(R.string.str_stop);
       
        bIsPaused = true;//视频播放完毕了,就自动回到了0位置,并停止了。点击停止/继续 即可播放。
       }
     });
   }

 @Override
 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void surfaceCreated(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
  //DisplayMetircs 类可以很方便的获取分辨率     获取窗口的分辨率
  //这里获取 窗口 的分辨率大小
       DisplayMetrics metrics = new DisplayMetrics();
       getWindowManager().getDefaultDisplay().getMetrics(metrics);
      
     //设置Layout的参数 
     LayoutParams lp = mSurfaceView01.getLayoutParams();    
     lp.width = metrics.widthPixels/2;
     lp.height =metrics.heightPixels/2;
     mSurfaceView01.setLayoutParams(lp);
 }
 
 

 @Override
 @Deprecated
 protected Dialog onCreateDialog(int id) {
  // TODO Auto-generated method stub
  
  final View v = View.inflate(this, R.layout.multimedia_set, null);
  final EditText videoPath = (EditText) v.findViewById(R.id.videoPath);
  switch(id){
  case 0:
  {
   Dialog dialog0 = new AlertDialog.Builder(this)
   .setTitle("播放文件")
   .setView(v).setMessage("请输入文件名:")
   .setPositiveButton("确定",
     new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface arg0, int arg1) {
       // 播放本地视频
             //视频文件放置在SD卡下的DCIM目录下,这里设置为默认路径
             //resetVideo();//重头播放,这个可以在播放完了后,执行,就可以实现循环播放了
       strVideoPath= "file:///sdcard/DCIM/"+videoPath.getText().toString();//此时只需输入文件名称如:test.3gp;
             setTitle("Playing" + strVideoPath);
      }
     }).create();
   return dialog0;
  }
  default:
   return null;
   
  }

 }
 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
  
 }
 
 private boolean checkSDCard()
   {
     /* */
     if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
     {
       return true;
     }
     else
     {
       return false;
     }
   }
  
   public void mMakeTextToast(String str, boolean isLong)
   {
     if(isLong==true)
     {
       Toast.makeText(multimedia_player2.this, str, Toast.LENGTH_LONG).show();
     }
     else
     {
       Toast.makeText(multimedia_player2.this, str, Toast.LENGTH_SHORT).show();
     }
   }
  

 //返回上一级Activity界面
 @Override
 public void onBackPressed() {
  // TODO Auto-generated method stub
  super.onBackPressed();
  Intent i =new Intent();
  i.setClass(multimedia_player2.this,multimedia.class);
  startActivity(i);
  finish();
 }
 
 
}

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/android2_bg9"
     >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:orientation="vertical" >

        <SurfaceView
            android:id="@+id/surfaceView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="0dp" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" >

            <ImageButton
                android:id="@+id/imageButton_start"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/paly1" />

            <ImageButton
                android:id="@+id/imageButton_pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pause1" />

            <ImageButton
                android:id="@+id/imageButton_reset"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/reset1" />

            <ImageButton
                android:id="@+id/imageButton_stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/stop" />
           
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

  • 大小: 423 KB
  • 大小: 499.2 KB
分享到:
评论

相关推荐

    SurfaceView+MediaPlayer视频播放以及小窗口和全屏播放

    本文将深入探讨如何利用这两个组件实现视频播放,包括小窗口(悬浮窗口)播放和全屏播放。 `SurfaceView`是一个特殊的视图,它提供了一个直接与硬件图形渲染管道连接的表面,使得视频帧可以直接绘制到屏幕上,减少...

    surfaceview+mediaplayer实现视频播放和动态设置全屏窗口切换。

    总之,SurfaceView和MediaPlayer的结合使用是Android实现高效视频播放的常见方案,而动态调整View尺寸和全屏切换是提升用户体验的重要手段。理解并熟练运用这些技术,可以构建出高质量的视频播放应用。

    android之surfaceview学习示例

    在这个"android之surfaceview学习示例"中,我们将深入探讨SurfaceView的核心特性和使用方法。 首先,SurfaceView拥有自己的Surface对象,它位于窗口的最底层,直接与硬件交互,允许在主线程之外进行绘制操作,避免...

    android surfaceview 播放视频

    - 用户交互:添加播放/暂停按钮,进度条,全屏切换等。 - 视频控制:支持快进、快退、调整音量和亮度。 - 文件管理:支持选择本地或网络视频,播放列表管理。 - 编码格式支持:处理不同的视频编码格式,可能需要使用...

    android surfaceview 播放视频代码

    - MediaController:可以添加MediaController来提供视频播放的控制界面,如播放/暂停按钮、进度条等。 通过以上内容,你应该能够理解如何在Android应用中使用SurfaceView播放MP4视频,并具备实现这个功能的基础。...

    Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法

    在Android开发中,SurfaceView是一种特殊的视图,用于处理高性能、低延迟的视频或图形渲染。在涉及到视频播放或者游戏等需要高效能画面更新的应用场景时,SurfaceView常常被使用。然而,使用SurfaceView时可能会遇到...

    AndroidSurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏画面或者视频播放。然而,有时我们可能会遇到一个问题:当我们尝试在SurfaceView上添加其他组件时,这些...

    本示例使用 SurfaceView 播放视频

    在Android开发中,SurfaceView是一种特殊的视图,用于处理高性能的图形输出,如视频播放、游戏画面等。这个示例的重点在于如何利用SurfaceView和MediaPlayer组件来实现自定义位置和大小的视频播放功能。以下是对这个...

    采用surfaceView录制视频

    SurfaceView是一种特殊的View,它提供了一个可以在应用程序和系统渲染器之间显示独立的、全屏的、高性能的图形表面。在这个主题中,我们将深入探讨如何利用SurfaceView来实现视频录制。 首先,我们需要了解...

    android 集成VLC 流媒体视频播放Demo

    例如,添加播放/暂停按钮、进度条、全屏切换等功能。你可以使用VLCPlayer的回调方法来更新UI状态。 6. **处理错误和异常** 在实际开发中,需要考虑网络不稳定、文件不存在、格式不支持等各种情况。VLCPlayer会抛出...

    利用SurfaceView,Handler实现的带有音乐文字的图片浏览器

    在这个图片浏览器中,可能有一个后台服务负责播放音乐,而UI上的控件(如播放/暂停按钮)则通过Handler与服务进行通信,控制音乐的播放状态。 5. **集成与设计**: 将这些组件有效集成在一起,需要良好的架构设计...

    Android代码-支持全屏、小窗口的视频播放器

    在Android开发中,创建一个支持全屏和小窗口播放切换的视频播放器是常见的需求,特别是在构建媒体应用或者社交应用时。"NiceVieoPlayer"是一个专为此目的设计的开源项目,它允许用户在全屏模式和悬浮小窗口模式之间...

    WebView实现全屏播放

    【WebView实现全屏播放】是Android开发中一个重要的应用场景,主要涉及到如何在WebView中嵌入视频并实现全屏播放的功能。这一技术广泛应用于各种移动应用,例如社交媒体、在线教育平台等,让用户能够在不离开应用的...

    Android视频聊天窗口切换

    Android提供了SurfaceView和TextureView来显示视频流,它们各有优缺点,如SurfaceView性能较好,适合全屏播放,而TextureView支持更复杂的图像变换,适合多窗口或画中画模式。 6. **并发处理**:当多个视频聊天窗口...

    MediaPlayer SurfaceView

    在Android开发中,`MediaPlayer`和`SurfaceView`是实现网络视频播放的关键组件。`MediaPlayer`是Android系统提供的媒体播放器类,它支持多种音频和视频格式,包括网络流媒体。而`SurfaceView`则是一种特殊的视图,...

    Android高级应用源码-Android 视频浮动窗口源码.zip

    10. **用户交互**:为了提供良好的用户体验,源码可能包含了播放/暂停、全屏、音量控制等功能的按钮和手势识别。 11. **调试与日志**:源码中应包含适当的日志记录,帮助开发者在出现问题时调试代码。 通过分析和...

    Android视频播放器 支持列表,完美切换全屏、小窗口的 .zip

    在Android平台上开发一款功能完善的视频播放器,支持列表播放、无缝切换全屏和小窗口模式,是提升用户体验的重要环节。本文将深入探讨实现这一目标所需的关键技术和知识点。 1. **视频解码与渲染** - **硬件加速**...

    自定义Dialog中播放视频

    MediaController是Android提供的一个组件,它可以为视频播放提供控制界面,包括播放/暂停按钮、进度条等。我们可以通过以下方式实现: ```java SurfaceView surfaceView = findViewById(R.id.surface_view); ...

    android VideoView 全屏

    通过适当地配置布局和监听事件,可以实现全屏播放,同时结合`AudioManager` 和窗口属性,可以实现对音量和屏幕亮度的控制,提升用户体验。在实际开发中,还可以结合`MediaController` 为用户提供更丰富的交互界面。

    Android视频播放demo

    在Android平台上,开发一款视频播放应用是一项常见的任务。在这个名为"Android视频播放demo"的项目中,开发者提供了一个集成简单、调用方便的代码示例,帮助其他开发者快速理解和实现视频播放功能。该项目主要涉及两...

Global site tag (gtag.js) - Google Analytics