【android,19】android照相机、视频录制,开启系统照相机和视频录制

来源:互联网 发布:电信网络转换 编辑:程序博客网 时间:2024/03/29 05:07

照相机开发:

一、照相机界面的设计:

1、照相机界面要求:

①、照相机屏幕是横屏显示:在清单文件中activity元素的android:screenOrientation

   属性指定显示状态,landscape为横屏显示,portrait为竖屏显示。不指定该属性时是横竖屏可以切换的。

     <application

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name" >

        <activity

           android:screenOrientation="landscape"

           android:name=".DemoActivity"

           android:label="@string/app_name" >

           <intent-filter>

                <actionandroid:name="android.intent.action.MAIN" />

 

                <categoryandroid:name="android.intent.category.LAUNCHER" />

           </intent-filter>

        </activity>

</application>

②、照相机全屏显示:就是隐藏activity的状态栏和标题栏。

 

在activity的onCreate方法中使用requestWindowFeature()方法设置显示窗体的状态,为Window.FEATURE_NO_TITLE 无标题状态。

注意:一定要写到 setcontentview()方法之前。

 

public class DemoActivity extends Activity implementsOnClickListener {

   

    public voidonCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

//不显示标题:

        // 一定要写到 setcontentview之前

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main);

//设置窗体隐藏状态栏

       getWindow().setFlags(

WindowManager.LayoutParams.FLAG_FULLSCREEN,

                WindowManager.LayoutParams.FLAG_FULLSCREEN);

  }

}

2照相机的界面布局:

<?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" >

 

    <SurfaceView    //SurfaceView    空间

       android:id="@+id/sv"

        android:layout_width="fill_parent"

       android:layout_height="fill_parent" />

 

    <LinearLayout

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_alignParentBottom="true"

       android:layout_alignParentRight="true"

       android:orientation="horizontal" >

 

        <Button

           android:id="@+id/autofocus"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="自动对焦" />

 

        <Button

           android:id="@+id/takepic"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="拍照" />

    </LinearLayout>

 

</RelativeLayout>

二、开发代码:

//获取各组件

SurfaceView sv = (SurfaceView) this.findViewById(R.id.sv);

//对焦的按钮

Button autofocus = (Button) this.findViewById(R.id.autofocus);

//拍照

Button takepic = (Button) this.findViewById(R.id.takepic);

//按钮注册点击事件:

autofocus.setOnClickListener(this);

takepic.setOnClickListener(this);

//获取SurfaceHolder对象

SurfaceHolder holder = sv.getHolder();

// 注意: 要写在holder创建之前:

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//设置SurfaceHolder回调函数

holder.addCallback(new Callback() {

 

    //SurfaceHolder销毁的方法

    public voidsurfaceDestroyed(SurfaceHolder holder) {

        camera.release();//释放资源

        camera = null;

    }

 

    //SurfaceHolder创建时调用的方法:

    public voidsurfaceCreated(SurfaceHolder holder) {

//将创建的SurfaceHolder对象设置给成员变量。

        DemoActivity.this.holder = holder;

        //照相机对象

        camera = Camera.open();

//获取照相机所有参数的键值对字符串.

        // String parrten = camera.getParameters().flatten();

 

        // TODO:设置照相机的参数

//获取照相机参数对象:      

        Camera.Parameters parms = camera.getParameters();

        System.out.println(parms.flatten());

//为参数设置值:

        parms.setPreviewFrameRate(5); //每秒显示的帧数

        parms.setPictureSize(1280, 960);//设置宽高

        parms.setPictureFormat(PixelFormat.JPEG);//设置照片的输出格式

        parms.set("jpeg-quality", 100);//照片质量

//

//      camera.setParameters(parms);

        //设置预览界面,surfaceHolder作为参数:

        camera.setPreviewDisplay(holder);

               

        //通过SurfaceView显示取景画面

        camera.startPreview();//开始预览

}

 

    @Override

public voidsurfaceChanged(SurfaceHolder holder, int format,

                    int width, int height) {

 

    }

});

 

 

按钮的点击事件方法:

public void onClick(View v) {

    switch (v.getId()) {

    case R.id.autofocus://点击对焦的按钮

        camera.autoFocus(null);//让手机对焦的方法:

        break;

    case R.id.takepic://点击照相按钮:

//takePicture方法参数1:按快门,拍照声音响起时的回调。

        参数2:照片后未压缩图片的回调

        参数3:照片后压缩成jpeg图片的回调

        camera.takePicture(null, null, new PictureCallback() {

            //方法参数1:照片的二进制字节数组

            public voidonPictureTaken(byte[] data, Camera camera) {

//判断sd是否可用

               if(Environment.MEDIA_MOUNTED.equals(

Environment.getExternalStorageState())){

                  //TODO:保存图片到sd卡

                       

        File file = new File(

Environment.getExternalStorageDirectory(),

System.currentTimeMillis()+".jpg");

        FileOutputStream fos = new FileOutputStream(file);

//      fos.write(data);

//      fos.flush();

//      fos.close();

        //decodeByteArray()方法获取Bitmap对象

        Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);

//压缩方法:

参数1:压缩的图片格式。

参数2:文件质量

参数3:文件的输出流

bm.compress(CompressFormat.JPEG,50, fos);

                           

        fos.flush();

        fos.close();

        Toast.makeText(

getApplicationContext(),"保存图片成功", 1).show();

        camera.startPreview();//重新开始预览图片

                       

     }else{

        Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();

                    }

                   

                }

            });

            break;

 

        }

 

    }

 

 

视频录制开发:mediaRecorder类

一、界面布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="fill_parent"

   android:layout_height="fill_parent" >

 

    <SurfaceView

       android:id="@+id/sv"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent" />

 

    <LinearLayout

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_alignParentBottom="true"

       android:layout_alignParentRight="true"

       android:orientation="horizontal" >

 

        <Button

           android:id="@+id/recoder"

           android:layout_width="wrap_content"

            android:layout_height="wrap_content"

           android:text="录制" />

 

        <Button

           android:id="@+id/stop"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:enabled="false"

            android:clickable="false"

           android:text="停止" />

    </LinearLayout>

 

</RelativeLayout>

二、业务代码:activity类 ,

public class DemoActivity extends Activity implementsOnClickListener {

    private SurfaceView sv;

    private Buttonstart,stop;

    private SurfaceHolderholder;

   

   

    private MediaRecorderrecorder;

    @Override

    public voidonCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

//获取组件

        sv = (SurfaceView)this.findViewById(R.id.sv);

//获取surfaceHolder

       holder =sv.getHolder();

      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

       start = (Button)this.findViewById(R.id.recoder);

       stop = (Button)this.findViewById(R.id.stop);

       start.setOnClickListener(this);

      stop.setOnClickListener(this);

       //SurfaceHolder 的回调

      holder.addCallback(new Callback() {

       

        @Override

        public void surfaceDestroyed(SurfaceHolder holder) {

            //

           

        }

       

        @Override

        public void surfaceCreated(SurfaceHolder holder) {

           

            DemoActivity.this.holder= holder;

//创建MediaRecorder对象

            recorder = newMediaRecorder();

            recorder.reset();

//从照相机采集视频

            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

//设置采集音频

            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//设置输出格式

            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//设置大小

            recorder.setVideoSize(720,480); // TODO ?

 

            recorder.setVideoFrameRate(3);//每秒3帧

//设置视频编码方式

            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);

            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    //判断sd是否可用      if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

           

            //创建视频文件对象

            File file = new File (

Environment.getExternalStorageDirectory(),

System.currentTimeMillis()+".3gp");

//视频输出的文件

            recorder.setOutputFile(file.getAbsolutePath());

     //设置显示

            recorder.setPreviewDisplay(DemoActivity.this.holder.getSurface());

           

            }else{

                Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();

            }

        }

       

        @Override

        public void surfaceChanged(SurfaceHolder holder, int format, intwidth,

                int height) {

            // TODO Auto-generatedmethod stub

           

        }

    });

      

    }

//按钮的点击事件方法

    public void onClick(Viewv) {

       

        switch (v.getId()) {

        case R.id.recoder://录制按钮

            try {

                recorder.prepare();//准备录制

            } catch (Exception e) {

                Toast.makeText(getApplicationContext(), "录制准备失败", 0).show();

                e.printStackTrace();

            }//预期准备

            recorder.start();

            stop.setEnabled(true);

            stop.setClickable(true);

           

            start.setEnabled(false);

            start.setClickable(false);

            break;

        case R.id.stop://停止按钮

            recorder.stop();

            recorder.release();

           

            start.setEnabled(true);

            start.setClickable(true);

           

            stop.setEnabled(false);

            stop.setClickable(false);

            break;

        }

    }

}

 

开启系统照相机意图:

 

一、是激活系统照相机组件:

public class DemoActivity extends Activity {

    /** Called when theactivity is first created. */

    private ImageView iv;

    @Override

    public voidonCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

        iv = (ImageView)this.findViewById(R.id.iv);

}

//点击按钮的事件方法:

public void click(Viewview){

//隐式意图 获取系统照相机组件

    Intent intent = new Intent();

    intent.setAction("android.media.action.IMAGE_CAPTURE");

    intent.addCategory("android.intent.category.DEFAULT");

    startActivityForResult(intent, 0); //以获取返回值开启组件

    }

   

    //以带返回值形式开启组件 ,触发的方法:

    protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

    // TODO Auto-generated method stub

    super.onActivityResult(requestCode, resultCode, data);

    // new Intent("inline-data").putExtra("data",bitmap);

    System.out.println("获取到照片");

   

    if(data!=null){

      Uri uri  = data.getData();

      //iv.setImageURI(uri);

      //System.out.println(uri.toString());

      String str =  data.getAction();

      if(str!=null){

          System.out.println(str);

      }

//查看源代码 获取图片

      Bitmap bitmap =data.getParcelableExtra("data");

//将图片设置在ImageView中显示:

      iv.setImageBitmap(bitmap);

    }

    }

}

二、激活系统录制视频组件:

public class DemoActivity extends Activity {

    /** Called when theactivity is first created. */

    private ImageView iv;

    @Override

    public voidonCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

        iv = (ImageView)this.findViewById(R.id.iv);

}

//按钮的点击方法

public void click(Viewview){

//隐式意图激活系统录制视频组件

    Intent intent = new Intent();

    intent.setAction("android.media.action.VIDEO_CAPTURE");

    intent.addCategory("android.intent.category.DEFAULT");

    startActivityForResult(intent, 0);

    }

   

    @Override

    protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

    // TODO Auto-generated method stub

    super.onActivityResult(requestCode, resultCode, data);

    // new Intent("inline-data").putExtra("data",bitmap);

    System.out.println("获取到照片");

   

    if(data!=null){

      Uri uri  = data.getData();

      通过获取的uri  播放录制的视频

   

    }

    }

}

0 0