美文网首页适配
Android 7.0 拍照裁剪适配

Android 7.0 拍照裁剪适配

作者: 打杂的_e2c9 | 来源:发表于2020-01-08 18:00 被阅读0次

Android 7.0 以后禁止向外公开fille://URL,因此需要使用FileProvider 向外传递URL.

FileProvider

1. 简介

2. 使用步骤

  • 在manifest 中声明provider
<provider
            android:authorities="${packagename}.provider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider" />
 </provider>

authorities:字段的值用来表明使用的使用者,在FileProvider的函数getUriForFile需要传入该参数。此值需要是唯一值,如果做sdk开发需要注意

name: 一般都固定为android.support.v4.content.FileProvider。如果开发者继承了FileProvider,则可以写上其绝对路径

exported:的值为false,表示该FileProvider只能本应用使用,不是public的
grantUriPermissions :值为true,表示允许赋予临时权限

meta-data:配置的是我们可以访问的文件的路径配置信息,需要使用xml文件进行配置,FileProvider会通过解析xml文件获取配置项,其中name名字不可改变为:{android.support.FILE_PROVIDER_PATHS},resource为配置路径信息的配置项目

  • 编辑xml 文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <paths>
    <!--<root-path/> 代表设备的根目录new File("/");-->
    <root-path
        name = ""
        path=""/>
    <!-- Context.getFilesDir() + "/path/" -->
    <files-path
        name="my_files"
        path="mazaiting/"/>
    <!-- Context.getCacheDir() + "/path/" -->
    <cache-path
        name="my_cache"
        path="mazaiting/"/>
    <!-- Context.getExternalFilesDir(null) + "/path/" -->
    <external-files-path
        name="external-files-path"
        path="mazaiting/"/>
    <!-- Context.getExternalCacheDir() + "/path/" -->
    <external-cache-path 
         name="name" 
         path="mazaiting/" />
    <!-- Environment.getExternalStorageDirectory() + "/path/" -->
    <external-path
        name="my_external_path"
        path="mazaiting/"/>
    <!-- Environment.getExternalStorageDirectory() + "/path/" -->
    <external-path
        name="files_root"
        path="Android/data/<包名>/"/>
    <!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/"   -->
    <external-path
        name="external_storage_root"
        path="."/>
  </paths>
</resources>
  • 在java 文件中的使用
FileProvider.getUriForFile(context,"${authorities}",file);

完成了以上3步就可以在android 7.0 进行相机的拍照剪裁适配了

android 7.0 相机适配

1. 拍照适配

  • 根据系统获取uri
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mOriPicUri = FileProvider.getUriForFile(context.getApplicationContext(),"com.letv.leeco.myapplication" +
                    ".provider",mOriPicFile);
        }else {
            mOriPicUri = Uri.fromFile(mOriPicFile);
        }
  • 打开相机拍照(这个与我们平时的操作没有不同)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUtil.mOriPicUri);
        startActivityForResult(intent, REQUEST_CODE_CAPTURE_CAMERA);

2. 照片剪裁适配

Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(uri, "image/*");// mUri是已经选择的图片Uri
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);// 输出图片大小
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,    Uri.fromFile(mFileUtil.mCropPicFile));
startActivityForResult(intent, REQUEST_CODE_CROP);

3.剪裁后处理适配

mBitmap = data.getParcelableExtra("data");
if (mBitmap!=null && mBitmap.getByteCount()>0){
       // 有些机型需要从返回值中拿到数据进行保存,否则无法直接从申请剪裁的uri中读取到数据
        mFileUtil.savePic(mBitmap,mFileUtil.mCropPicFile);
        mPic.setImageBitmap(mBitmap);
}else {
         try{
              Uri uri = Uri.fromFile(mFileUtil.mCropPicFile);
              Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),uri);
               mPic.setImageBitmap(bitmap);
          }catch (Exception e){
                Log.i(TAG, "onActivityResult: e = "+e.getMessage());
          }
 }

项目地址:https://github.com/pangwenwen/android7.0-camera

相关文章

网友评论

    本文标题:Android 7.0 拍照裁剪适配

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