Android 7.0+相機、相冊、裁剪適配問題
在manifest中:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.***.***.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
1、android:authorities:可以隨便取,在之后的代碼需要一一對應:
2、android:resource:創建一個xml文件夾,xml文件夾下創建file_paths資源文件
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="" name="camera_photos" />
<files-path path="" name="photos" />
</paths>
</resources >
代碼中:
private String mPhotoPath; private Bitmap mBitmap; private File mAvatarFile; private File fileUri;
/** * 調用手機相機 */ private void getImageFromPhoto() { File file = new File(Constants.APP_PATH); if (!file.exists()) { file.mkdirs(); } mPhotoPath = Constants.APP_PATH + String.valueOf(System.currentTimeMillis()) + ".jpg"; fileUri = new File(mPhotoPath); Intent intentCamera = new Intent(); Uri imageUri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { imageUri = FileProvider.getUriForFile(ChangeUserInfoActivity.this, "com.***.***.fileprovider", fileUri); } else { imageUri = Uri.fromFile(fileUri); } intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intentCamera, START_PHOTO_CAMERA_REQUEST); }
/** * 調用手機相冊 */ private void allPhoto() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, START_PHOTO_IMAGE_REQUEST); }
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == START_PHOTO_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { //調用相冊 Cursor cursor = getContentResolver().query(data.getData(), new String[]{MediaStore.Images.Media.DATA}, null, null, null); //游標移到第一位,即從第一位開始讀取 if (cursor != null) { cursor.moveToFirst(); mPhotoPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); cursor.close(); //調用系統裁剪 mAvatarFile = new File(mPhotoPath); final Uri uri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(this, "com.***.***.fileprovider", mAvatarFile); } else { uri = Uri.fromFile(mAvatarFile); } startPhoneZoom(uri); } } if (requestCode == START_PHOTO_CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { //相機返回結果,調用系統裁剪 mAvatarFile = new File(mPhotoPath); Uri uri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(this, "com.***.***.fileprovider", mAvatarFile); } else { uri = Uri.fromFile(mAvatarFile); } startPhoneZoom(uri); } if (requestCode == START_CROP_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { //設置裁剪返回的位圖 Bundle bundle = data.getExtras(); if (bundle != null) { mBitmap = bundle.getParcelable("data"); SDLogUtil.d(TAG, "--------------bitmap------------" + mBitmap); } } }
/** * 調用系統裁剪的方法 */ private void startPhoneZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } intent.setDataAndType(uri, "image/*"); //是否可裁剪 intent.putExtra("corp", "true"); //裁剪器高寬比 intent.putExtra("aspectY", 1); intent.putExtra("aspectX", 1); //設置裁剪框高寬 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); //返回數據 intent.putExtra("return-data", true); startActivityForResult(intent, START_CROP_IMAGE_REQUEST); }
