1弱睦、調(diào)用系統(tǒng)Camera App實(shí)現(xiàn)拍照和攝像功能
//重寫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 = "";
//手動獲取拍照權(quán)限
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:表示讀取權(quán)限;
* FLAG_GRANT_WRITE_URI_PERMISSION:表示寫入權(quán)限来涨。
*/
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
}
}
準(zhǔn)備工作
上面調(diào)用系統(tǒng)Camera App晒夹,我們壓根不需要任何權(quán)限,但是這里用Camera API僚稿,就必須在manifest內(nèi)聲明使用權(quán)限凡桥,通常由以下三項(xiàng)
<uses-permission android:name = "android.permission.CAMERA" />
<uses-feature android:name = "android.hardware.camera" />
<uses-feature android:name = "android.hardware.camera.autofocus" />
一般拍照和攝像的時候需要寫到sd卡上,所以還有一向權(quán)限聲明如下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
真做攝像功能時贫奠,需要音頻錄制和視頻錄制功能唬血,所以又需要下面兩項(xiàng)權(quán)限聲明
<uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
另外使用Camera API拍照或攝像,都需要用到預(yù)覽唤崭,預(yù)覽就要用到SurfaceView拷恨,為此Activity的布局中必須有SurfaceView。