美文网首页
Android7.0拍照选取图片裁剪

Android7.0拍照选取图片裁剪

作者: 飞奔吧牛牛 | 来源:发表于2018-09-17 18:53 被阅读0次

Android拍照和选取图片之前需要先获取对应的权限。
需要了解的请看 Android6.0权限管理
下面默认已经获取权限。
测试机型:
vivo V3Max A android 5.1.1
Honor NOTE 8(型号:EDI-AL10) android 7.0

适配Android7.0。

Uri.fromFile() 方法被 FileProvider.getUriForFile() 代替。

第一步:再清单文件中配置provider。
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.app.takephoto.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
第二步:在res目录下新建xml目录,在xml目录下新建file_paths.xml文件。(名字可以随便起,只要和清单文件中配置的一样就行),配置为path=""意思是将整个根目录给共享出去,如果设置为path="/abc"就只能获取/adc目录下文件的uri了。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <root-path
            name="root"
            path="" />
        <files-path
            name="files"
            path="" />
        <cache-path
            name="cache"
            path="" />
        <external-path
            name="external"
            path="" />
        <external-files-path
            name="external_file_path"
            path="" />
        <external-cache-path
            name="external_cache_path"
            path="" />
    </paths>
</resources>
第三步:在需要文件Uri的地方这样调用
 public static Uri getUriForN(Context context, File file) {
        return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file);
    }
准备
public class AppUtil {
    //存放照片的目录
    public static String getImageRootPath() {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/takephoto";
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        return path;
    }
}

拍照

调用PhotoUtil拍照方法
private File photoFile;
photoFile = new File(AppUtil.getImageRootPath(), System.currentTimeMillis() + "camer.jpg");
PhotoUtil.takePhoto(context, photoFile, requestCode);
PhotoUtil
public static void takePhoto(Context context, File outPutFile, int requestCode) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {// >=7.0
            Uri outputUri = getUriForN(context, outPutFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        } else {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outPutFile));
        }
        ((Activity) context).startActivityForResult(intent, requestCode);
    }

从相册选择

调用PhotoUtil从相册选择方法
PhotoUtil.choosePhoto(context, requestCode);
PhotoUtil
public static void choosePhoto(Context context, int requestCode) {
        //用这种方法就不用区分>=19来获取路径了
//        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//        ((Activity) context).startActivityForResult(intent, requestCode);
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        ((Activity) context).startActivityForResult(intent, requestCode);
    }

onActivityResult 回调

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_TAKE_PHOTO) {//拍照
            if (resultCode == Activity.RESULT_OK) {
                photoUtil.zoomPhoto(this, photoFile, zoomFile, REQUEST_CODE_ZOOM_PHOTO);
            } else if (resultCode == Activity.RESULT_CANCELED) {
                Log.e(TAG, "拍照已取消");
            }
        } else if (requestCode == REQUEST_CODE_CHOOSE_PHOTO) {
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    Uri data_choose_photo = data.getData();
                    String path = photoUtil.getPath(this, data_choose_photo);
                    photoUtil.zoomPhoto(this, new File(path), zoomFile, REQUEST_CODE_ZOOM_PHOTO);
                }
            } else if (resultCode == Activity.RESULT_CANCELED) {
                Log.e(TAG, "选择照片已取消");
            }
        } else if (requestCode == REQUEST_CODE_ZOOM_PHOTO) {
            if (resultCode == Activity.RESULT_OK) {
                Bitmap bitmap = BitmapFactory.decodeFile(zoomFile.getAbsolutePath());
                iv.setImageBitmap(bitmap);
            } else if (requestCode == Activity.RESULT_CANCELED) {
                Log.e(TAG, "裁剪照片已取消");
            }
        }
    }

针对图库得到图片路径

 //针对图库得到图片路径
    public static String getPath(Context context, Uri uri) {
        String imagePath = null;
        if (Build.VERSION.SDK_INT >= 19) {
            if (DocumentsContract.isDocumentUri(context, uri)) {
                String docId = DocumentsContract.getDocumentId(uri);

                if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                    String id = docId.split(":")[1];
                    String selection = MediaStore.Images.Media._ID + "=" + id;
                    imagePath = getImagePath(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
                } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                    imagePath = getImagePath(context, contentUri, null);
                }
            } else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) {
                imagePath = getImagePath(context, uri, null);
            } else if ( ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) {
                imagePath = uri.getPath();
            }
        } else {
            imagePath = getImagePath(context, uri, null);
        }
        return imagePath;
    }

    private static String getImagePath(Context context, Uri uri, String selection) {
        String Path = null;
        Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                Path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return Path;
    }

如有错误欢迎补充和指正~~

相关文章

网友评论

      本文标题:Android7.0拍照选取图片裁剪

      本文链接:https://www.haomeiwen.com/subject/rtgigftx.html