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。