以下是自己简单做了一个实例 ,还需要先优,后期会做优化版本
在android7测试过
首先 在AndroidManifest.xml 新增权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions"></uses-permission> <uses-permission android:name="android.permission.CAMERA"/>
TakePictureActivity.java
package com.example.a20200712;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SearchEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
public class TakePictureActivity extends AppCompatActivity {
//自定义
private final int REQUEST_CODE_CAMERA = 1001;
private final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 1002;
private SurfaceView surfaceView;
private RelativeLayout relative;
private Camera camera;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注意以下两行一定要写在 setContentView()方法的前面,不然会报错的
//去掉标题栏
getSupportActionBar().hide();
//没有状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.take_picture_layout);
surfaceView = findViewById(R.id.take_picture_layout_sur);
relative = findViewById(R.id.take_picture_layout_btns);
//把相机内容直接输出到屏幕上
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置画面分辨率
surfaceView.getHolder().setFixedSize(176, 144);
//设置保持屏幕高亮
surfaceView.getHolder().setKeepScreenOn(true);
surfaceView.getHolder().addCallback(new surfaceViewCallback());
}
/**
* 权限动态申请
*/
public void requestPermission() {
// checkSelfPermission 判断是否已经申请了此权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//如果应用之前请求过此权限但用户拒绝了请求,shouldShowRequestPermissionRationale将返回 true。
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
} else {
// ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
}
}
}
/**
* 申请结果返回
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_CAMERA || requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
relative.setVisibility(ViewGroup.VISIBLE);
return true;
}
return super.onTouchEvent(event);
}
/**
* 拍照
* @param view
*/
public void takePicture(View view) {
camera.takePicture(null, null, new pictureCallback());
}
/**
* 对焦
* @param view
*/
public void focusOnclick(View view) {
camera.autoFocus(null);
}
private class pictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream fos = null;
try {
File pictureFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if(camera!=null){
//重新刷新相机
camera.startPreview();
}
}
}
private final class surfaceViewCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
requestPermission();
camera = Camera.open();//打开照相机
Camera.Parameters param = camera.getParameters();//获取参数列表,由于不同厂商参数不同
// param.setPreviewFrameRate(5);//频率
// param.setPictureSize(100,4608);
Log.i("mw", param.flatten());
param.setJpegQuality(80);
camera.setParameters(param);
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();//开始预视
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureSize(320, 240);
parameters.getFocusMode();
parameters.setPictureFormat(PixelFormat.JPEG);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}
private void releaseCamera() {
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
}
take_picture_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/take_picture_layout_sur"></SurfaceView>
<RelativeLayout
android:id="@+id/take_picture_layout_btns"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/take_picture_layout_take"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="20dp"
android:text="对焦"
android:onClick="focusOnclick"></Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/take_picture_layout_take"
android:onClick="takePicture"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="20dp"
android:text="拍照"></Button>
</RelativeLayout>
</FrameLayout>