Android拍照,錄製視頻,相機簡易功能實現

來源:互聯網
上載者:User

標籤:back   break   圖片   smo   profile   output   tpi   set   top   

1.,功能沒有錄製出來。

基本實現了拍照,錄製視頻,前後網路攝影機切換的功能,可以轉屏,聚焦。

代碼在最下面,可以看代碼,運行apk看實際效果。

2.工具類

 

package com.example.mycamera;import android.content.Context;import android.hardware.Camera;import android.media.MediaRecorder;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import static android.content.ContentValues.TAG;/** * Created by guoxw on 2017/10/31. * <!- 實現拍照,錄影:  並儲存圖片,視頻到本地></!-> */public class CameraUtils {    private MediaRecorder mediaRecorder;    private Camera camera;    /*** 標識當前是前網路攝影機還是後網路攝影機  back:0  front:1*/    private int backOrFtont = 0;    private SurfaceHolder.Callback callback;    private Context context;    private SurfaceView surfaceView;    /***錄製視頻的videoSize*/    private int height, width;    /***photo的height ,width*/    private int heightPhoto, widthPhoto;    public void create(SurfaceView surfaceView, Context context) {        this.context = context;        this.surfaceView = surfaceView;        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        surfaceView.setKeepScreenOn(true);        callback = new SurfaceHolder.Callback() {            public void surfaceCreated(SurfaceHolder holder) {                camera = Camera.open();                getVideoSize();                mediaRecorder = new MediaRecorder();            }            public void surfaceChanged(SurfaceHolder holder, int format,                                       int width, int height) {                doChange(holder);                focus();            }            @Override            public void surfaceDestroyed(SurfaceHolder holder) {                if (camera != null) {                    camera.release();                    camera = null;                }            }        };        surfaceView.getHolder().addCallback(callback);    }    private void doChange(SurfaceHolder holder) {        try {            camera.setPreviewDisplay(holder);            camera.setDisplayOrientation(90);            camera.startPreview();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 切換網路攝影機     */    public void changeCamera() {        int cameraCount = 0;        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();        cameraCount = Camera.getNumberOfCameras();        for (int i = 0; i < cameraCount; i++) {            Camera.getCameraInfo(i, cameraInfo);            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && backOrFtont == 0) {                camera.stopPreview();                camera.release();                camera = null;                camera = Camera.open(i);                try {                    camera.setPreviewDisplay(surfaceView.getHolder());                    camera.setDisplayOrientation(90);                } catch (IOException e) {                    e.printStackTrace();                }                backOrFtont = 1;                camera.startPreview();                break;            } else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK && backOrFtont == 1) {                camera.stopPreview();                camera.release();                camera = null;                camera = Camera.open(i);                try {                    camera.setPreviewDisplay(surfaceView.getHolder());                    camera.setDisplayOrientation(90);                } catch (IOException e) {                    e.printStackTrace();                }                camera.startPreview();                backOrFtont = 0;                break;            }        }    }    public void stopRecord() {        mediaRecorder.release();        camera.release();        mediaRecorder = null;        camera = Camera.open();        mediaRecorder = new MediaRecorder();        doChange(surfaceView.getHolder());    }    public void stop() {        if (mediaRecorder != null && camera != null) {            mediaRecorder.release();            camera.release();        }    }    public void destroy() {        if (mediaRecorder != null && camera != null) {            mediaRecorder.release();            camera.release();            mediaRecorder = null;            camera = null;        }    }    /**     * @param path 儲存的路徑     * @param name 錄影視頻名稱(不包含尾碼)     */    public void startRecord(String path, String name) {        camera.unlock();        mediaRecorder.setCamera(camera);        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);        //mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);        mediaRecorder.setVideoEncodingBitRate(700 * 1024);        mediaRecorder.setVideoSize(width, height);        mediaRecorder.setVideoFrameRate(24);        //getVideoSize();        File file = new File(path);        if (!file.exists()) {            file.mkdirs();        }        mediaRecorder.setOutputFile(path + File.separator + name + ".mp4");        File file1 = new File(path + File.separator + name + ".mp4");        if (file1.exists()) {            file1.delete();        }        mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());        /***不設定時,錄製的視頻總是倒著,翻屏導致視頻上下翻滾*/        mediaRecorder.setOrientationHint(0);        try {            mediaRecorder.prepare();            mediaRecorder.start();        } catch (IOException e) {            e.printStackTrace();        }    }    /***     * 擷取SupportedVideoSizes 控制輸出視頻width在300到600之間(儘可能小)     * 擷取PictureSize的大小(控制在w:1000-2000之間)     */    public void getVideoSize() {        Camera.Parameters parameters = camera.getParameters();        List<Camera.Size> videoSize = parameters.getSupportedVideoSizes();        for (int i = 0; i < videoSize.size(); i++) {            int width1 = videoSize.get(i).width;            int height1 = videoSize.get(i).height;            if (width1 >= 300 && width1 <= 600) {                if (height1 >= 200 && height1 <= 600) {                    width = width1;                    height = height1;                }            }            Log.d(TAG, "getVideoSize:----w:-- " + videoSize.get(i).width + "---h:--" + videoSize.get(i).height);        }        List<Camera.Size> photoSize = parameters.getSupportedPictureSizes();        for (int i = 0; i < photoSize.size(); i++) {            int width1 = photoSize.get(i).width;            int height1 = photoSize.get(i).height;            if (width1 >= 1000 && width1 <= 2000) {                if (height1 >= 600 && height1 <=2000) {                    widthPhoto = width1;                    heightPhoto = height1;                }            }        }    }    public void takePicture(String photoPath, String photoName) {        camera.takePicture(null, null, new PictureCallBack(photoPath, photoName));    }    /**     * 聚焦     */    public void focus(){        Camera.Parameters parameters=camera.getParameters();        parameters.setPictureSize(widthPhoto,heightPhoto);        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);        camera.setParameters(parameters);        camera.cancelAutoFocus();    }    /*** 拍照功能*/    private class PictureCallBack implements Camera.PictureCallback {        /*** 照片儲存的路徑和名稱*/        private String path;        private String name;        public PictureCallBack(String path, String name) {            this.path = path;            this.name = name;        }        @Override        public void onPictureTaken(byte[] bytes, Camera camera) {            File file1 = new File(path);            if (!file1.exists()) {                file1.mkdirs();            }            File file = new File(path, name);            if (file.exists()) {                file.delete();            }            FileOutputStream fos = null;            try {                fos = new FileOutputStream(file);                try {                    fos.write(bytes);                } catch (IOException e) {                    e.printStackTrace();                }            } catch (FileNotFoundException e) {                e.printStackTrace();            }            camera.startPreview();        }    }}

 

  

 

3.使用就直接調用方法了。

package com.example.mycamera;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.SurfaceView;import android.view.View;import android.view.Window;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private static final String TAG = "PlayActivity";    private SurfaceView surfaceView;    private CameraUtils cameraUtils;    private String path, name;    private ImageView btn;    private ImageView camera;    private ImageView change;    int x = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        Log.d(TAG, "onCreate: ");        getSupportActionBar().hide();        btn = (ImageView) findViewById(R.id.btn);        camera = (ImageView) findViewById(R.id.camera);        change = (ImageView) findViewById(R.id.change);        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);        cameraUtils = new CameraUtils();        cameraUtils.create(surfaceView, this);        path = Environment.getExternalStorageDirectory().getAbsolutePath();        name = "Video";        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (x == 0) {                    // cameraUtils.changeCamera();                    cameraUtils.startRecord(path, name);                    btn.setImageResource(R.drawable.video);                    x = 1;                } else if (x == 1) {                    cameraUtils.stopRecord();                    btn.setImageResource(R.drawable.video1);                    x=0;                }            }        });        camera.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                cameraUtils.takePicture(path, "name.png");            }        });        change.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                cameraUtils.changeCamera();            }        });    }    @Override    protected void onResume() {        super.onResume();        Log.d(TAG, "onResume: ");    }    @Override    protected void onPause() {        super.onPause();        Log.d(TAG, "onPause: ");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG, "onStop: ");        cameraUtils.stop();    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy: ");        cameraUtils.destroy();    }}

  

code:

https://pan.baidu.com/s/1hr7KnA0

 

Android拍照,錄製視頻,相機簡易功能實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.