1. 程式人生 > >Android 自定義照相機

Android 自定義照相機

首先看看效果圖
這裡寫圖片描述這裡寫圖片描述
第一個是拍照的頁面
第二個是錄影的介面
畫布多說先上程式碼
拍照佈局

這裡寫程式碼片<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height
="match_parent" android:orientation="vertical" tools:context="com.zking.mycamera.MainActivity">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height
="wrap_content" android:text="拍照" android:onClick="start"/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="錄影" android:id="@+id/btn_main_lu" android:onClick
="lu"/>
</LinearLayout> <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_main_sufaceView"/> </LinearLayout>

拍照程式碼

package com.zking.mycamera;

import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private SurfaceView surfaceView;
    private Camera camera;
    private SurfaceHolder surfaceHolder;
    private Button btn_main_lu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        surfaceView = (SurfaceView) findViewById(R.id.sv_main_sufaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                camera = Camera.open();
                try {
                    //和surfaceView繫結
                    camera.setPreviewDisplay(holder);
                    //相機物件
                    Camera.Parameters parameters = camera.getParameters();
                    //設定儲存格式
                    parameters.setPictureFormat(PixelFormat.JPEG);
                    //設定質量
                    parameters.set("jepg-quality", 85);
                    //設定引數
                    camera.setParameters(parameters);
                    //啟動攝像頭預覽
                    camera.startPreview();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                //關閉預覽
                camera.stopPreview();
                //釋放記憶體 因為此類是原生代碼所以需要手動釋放記憶體
                camera.release();
                camera = null;
            }
        });

        btn_main_lu = (Button) findViewById(R.id.btn_main_lu);

    }


    public void start(View view) {
        camera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                try {
                    //檔案流
                    FileOutputStream fileOutputStream = new FileOutputStream("/mnt/sdcard/" + System.currentTimeMillis() + ".jpg");
                    fileOutputStream.write(data);
                    fileOutputStream.close();
                    Toast.makeText(MainActivity.this, "儲存成功", Toast.LENGTH_SHORT).show();
                    //開始預覽
                    camera.startPreview();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void lu(View view) {
        startActivity(new Intent(this,VideoTapeActivity.class));
    }
}

錄影佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_video_tape"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zking.mycamera.VideoTapeActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="錄影"
        android:onClick="start"/>
    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/sv_video_tape_surface"/>
</LinearLayout>

錄影程式碼

package com.zking.mycamera;

import android.media.MediaRecorder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

public class VideoTapeActivity extends AppCompatActivity {

    private MediaRecorder mediaRecorder;
    private SurfaceView surfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_tape);
        initViews();
    }

    private void initViews() {
        surfaceView = (SurfaceView) findViewById(R.id.sv_video_tape_surface);
    }

    public void start(View view){
        Button button = (Button) view;
        if (button.getText().toString().equals("錄影")) {
            mediaRecorder = new MediaRecorder();
            mediaRecorder.reset();
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //從照相機採集視訊
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mediaRecorder.setVideoFrameRate(3); //每秒3幀
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //設定視訊編碼方式
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            File videoFile = new File("mnt/sdcard/" + System.currentTimeMillis() + ".mp4");
            mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
            mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
            try {
                mediaRecorder.prepare();//預期準備
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaRecorder.start();
            button.setText("停止");
        } else {
            button.setText("開始");
            mediaRecorder.stop();
            mediaRecorder.release();
            Toast.makeText(this, "儲存成功", Toast.LENGTH_SHORT).show();
        }
    }
}

本此用到的許可權

<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 寫記憶體卡許可權 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 讀記憶體卡許可權 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 錄音許可權 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />