Android 7.0+相機、相冊、裁剪適配問題


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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM