1、调用系统Camera App实现拍照和摄像功能
//重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == Activity.DEFAULT_KEYS_DIALER && resultCode == Activity.RESULT_OK){
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
img_show.setImageBitmap(bitmap);
// img_show.setImageURI(Uri.fromFile(currentImageFile));
}
}
private static final int TAKE_PHOTO_REQUEST_CODE = 1;
public static void takePhoto(Context context) {
String filePath = "";
//手动获取拍照权限
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, TAKE_PHOTO_REQUEST_CODE);
} else {
//获取Uri
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, currentImageFile.getAbsolutePath());
Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
/** * FLAG_GRANT_READ_URI_PERMISSION:表示读取权限;
* FLAG_GRANT_WRITE_URI_PERMISSION:表示写入权限。
*/
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
}
}
准备工作
上面调用系统Camera App,我们压根不需要任何权限,但是这里用Camera API,就必须在manifest内声明使用权限,通常由以下三项
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
一般拍照和摄像的时候需要写到sd卡上,所以还有一向权限声明如下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
真做摄像功能时,需要音频录制和视频录制功能,所以又需要下面两项权限声明
<uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
另外使用Camera API拍照或摄像,都需要用到预览,预览就要用到SurfaceView,为此Activity的布局中必须有SurfaceView。