多媒体拍照+摄像

来源:互联网 发布:java中工厂模式是什么 编辑:程序博客网 时间:2024/05/16 13:40

首先拍照就是要用到相机所以我们需要在清单文件中配置权限:

<!--照相机的权限-->    <uses-permission android:name="android.permission.CAMERA"></uses-permission>

当拍完照之后我们是存在sd卡中的所以我们还需要加的权限就是获得内存卡的写的权限:

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当然还可以在清单文件中设置横屏:

      <activity android:name=".MediaplayActivity"            android:screenOrientation="landscape">        </activity>

展示画面用的还是SurfceView,布局文件:

    <SurfaceView        android:id="@+id/sv_main_surface"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:onClick="takePhoto"        android:text="拍照" />

surfaceview里有一个gethodler然后里面有一个回掉函数,里面重写了三个方法就是在里面打开相机和关闭相机。代码:

   surface = (SurfaceView) findViewById(R.id.sv_main_surface);        surface.getHolder().addCallback(new SurfaceHolder.Callback() {            @Override//开始            public void surfaceCreated(SurfaceHolder surfaceHolder) {                //打开相机                camera = Camera.open();                //设置参数                Camera.Parameters parameters=camera.getParameters();                //输出的格式                parameters.setPictureFormat(PixelFormat.JPEG);                //照片的质量                parameters.set("jpeg-quality",85);               // 给照相机设置参数                camera.setParameters(parameters);                try {                    //展示画面到sufaceview                    camera.setPreviewDisplay(surface.getHolder());                    //开启预览                    camera.startPreview();                } catch (IOException e) {                    e.printStackTrace();                }            }            @Override            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {            }            @Override            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {                //关闭相机               if(camera!=null){                   camera.release();//释放资源                   camera.stopPreview();//停止                   camera=null;               }            }        });

当你点击拍照的时候就把照片存进SD卡里。要将图片进行压缩。将字节数组转成Bitmap。
代码:

public  void takePhoto(View view){    camera.takePicture(null, null, new Camera.PictureCallback() {        @Override        public void onPictureTaken(byte[] bytes, Camera camera) {            //实例化文件输出流            //写            //压缩(图片)            //将字节数组转成Bitmap            Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);            try {                FileOutputStream fos=new FileOutputStream("/mnt/sdcard/dcim/camera/G150831_"+System.currentTimeMillis()+".png");                bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);                //重新继续拍照                camera.stopPreview();                camera.startPreview();            } catch (FileNotFoundException e) {                e.printStackTrace();            }        }    });}

上效果图:
这里写图片描述

接下来要讲的就是摄像了
我们也要在这里加权限,和照相一样只不过要多加一个允许摄像的权限:

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

摄影用的也是surfaceview 布局文件:

    <SurfaceView        android:id="@+id/sv_media_recorder_surface"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="start"            android:text="开始" />        <Button            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:onClick="stop"            android:text="停止" />    </LinearLayout>

在这边用到的就是 mediaRecorder(媒体录制器)了。
实例化媒体录制器在,可以通过 mediaRecorder来设置音频与视频来源。
代码:

public class MediaplayActivity extends AppCompatActivity{    private SurfaceView surfaceView;    private MediaRecorder mediaRecorder;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mediaplay);        surfaceView = (SurfaceView) findViewById(R.id.sv_media_recorder_surface);        //实例化媒体录制器        mediaRecorder = new MediaRecorder();    }    public void start(View view){        mediaRecorder.reset();        //设置参数        //设置音频,视频来源        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);        //设置输出格式        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);        //设置编码格式(视频,音频)        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);        //设置保存路径        mediaRecorder.setOutputFile("/mnt/sdcard/mt_video"+System.currentTimeMillis()+".mp4");        //画面        mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());        //准备        try {            mediaRecorder.prepare();            mediaRecorder.start();        } catch (IOException e) {            e.printStackTrace();        }    }    public void stop(View view){        mediaRecorder.stop();    }}

最后上效果图:
这里写图片描述

0 0
原创粉丝点击