自定義拍照
實現效果:

布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout 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" tools:context="com.example.p_.MainActivity"><SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sfv_mian" /><Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照" android:onClick="pz" /></RelativeLayout>SurfaceView接受攝像頭界面變化的信息
//SurfaceView接受攝像頭界面變化的信息 sfv_mian.getHolder().addCallback(new SurfaceHolder.Callback);//重寫三個方法重寫三個方法
具體邏輯代碼在三個方法中
//預覽界面被創建時,調用一般在這里打開照相機和設置照相機的一些參數 @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //開啟攝像頭(Camera.open()就是后面攝像頭,可以填參數的可以設置前后攝像頭) camera = Camera.open(); //給攝像頭設置參數 Camera.Parameters parameters = camera.getParameters(); // 設置每秒3棧 //parameters.setPictureFormat(3); // 設置照片的輸出格式 parameters.setPictureFormat(PixelFormat.JPEG); // 設置照片的質量(第一個參數:是規定了的, // 第二個參數:0-100(越大越質量好,但是是根據手機像素,設置85差不多)) parameters.set("jpeg-quality",85); // 給照相機設置參數 camera.setParameters(parameters); //將攝像頭的畫面顯示到SurfaceView控件上 try { camera.setPReviewDisplay(sfv_mian.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) { } });保存
當然保存要將字節轉成Bitmap
//第一個參數:快門,第二個參數存放raw文件下,第三個參數想存到那就到那 camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] bytes, Camera camera) { //將字節改變成圖片 //壓縮 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); try { FileOutputStream fileOutputStream=new FileOutputStream("/mnt/sdcard/DCIM/王琰"+System.currentTimeMillis()+".png"); bitmap.compress(Bitmap.CompressFormat.PNG,85,fileOutputStream); //停止 camera.stopPreview(); //重新拍照 camera.startPreview(); }catch (Exception e){ } } });添加權限(清單文件)
第一個權限是照相機的權限
第二個權限是獲取寫文件的權限
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
新聞熱點
疑難解答