您好,欢迎来到99网。
搜索
您的当前位置:首页android7.0+FileProvider访问隐私文件相册、相机、安装应用的适配

android7.0+FileProvider访问隐私文件相册、相机、安装应用的适配

来源:99网
android7.0+FileProvider访问隐私⽂件相册、相机、安装应⽤的

适配

从 Android 7.0 开始,Android SDK 中的 策略禁⽌开发⼈员在应⽤外部公开 file:// URI。具体表现为,当我们在应⽤中使⽤包含 file:// URI 的 Intent离开⾃⼰的应⽤时,程序会发⽣FileUriExposedException 异常

这⾥我们要使⽤到的 FileProvider,就是 ContentProvider 的⼀个特殊⼦类,帮助我们将访问受限的 file:// URI 转化为可以授权共享的 content:// URI。⾸先 要去 Manifest⽂件⾥注册FileProvider

android:allowBackup=\"true\"

android:icon=\"@mipmap/ic_launcher\" android:label=\"@string/app_name\" android:supportsRtl=\"true\"

android:theme=\"@style/AppTheme\">

android:name=\"android.support.v4.content.FileProvider\"

android:authorities=\"${applicationId}.FileProvider\" //此处的属性值后⾯获取URI⽤到 android:grantUriPermissions=\"true\" android:exported=\"false\"> android:name=\"android.support.FILE_PROVIDER_PATHS\" android:resource=\"@xml/file_paths\"/>

其次在 res ⽬录下新建⼀个 xml ⽂件夹 ⾥边添加⼀个xml⽂件 名字⽐如:path.xml

元素必须包含⼀到多个⼦元素。这些⼦元素⽤于指定共享⽂件的⽬录路径,必须是这些元素之⼀:

:内部存储空间应⽤私有⽬录下的 files/ ⽬录,等同于 Context.getFilesDir() 所获取的⽬录路径;:内部存储空间应⽤私有⽬录下的 cache/ ⽬录,等同于 Context.getCacheDir() 所获取的⽬录路径;:外部存储空间根⽬录,等同于 Environment.getExternalStorageDirectory() 所获取的⽬录路径;

:外部存储空间应⽤私有⽬录下的 files/ ⽬录,等同于 Context.getExternalFilesDir(null) 所获取的⽬录路径;:外部存储空间应⽤私有⽬录下的 cache/ ⽬录,等同于 Context.getExternalCacheDir(); 获取URI的⽅法:

在Android7.0以下 获取相册图⽚URI的⽅式:

Uri uri= Uri.from ( file );

Android 7.0+获取相册图⽚的⽅式:

//注意此处的 第⼆个参数必须与 Manifest⽂件中Provider 的 android:authorities ⼀致

Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + \".FileProvider\

Android 7.0以下 安装应⽤:

Intent installIntent = new Intent(Intent.ACTION_VIEW);

installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

installIntent.setDataAndType(Uri.fromFile(apkFile), \"application/vnd.android.package-archive\");startActivity(installIntent);

Android 7.0+ 安装应⽤:

//采⽤FileProvider的⽅式访问⽂件

File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), \"app_sample.apk\");Uri apkUri = FileProvider.getUriForFile(this,

BuildConfig.APPLICATION_ID+\".FileProvider\

Intent installIntent = new Intent(Intent.ACTION_VIEW);

installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加此处 是临时对⽂件的授权 必须加上此句

installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

installIntent.setDataAndType(apkUri, \"application/vnd.android.package-archive\");startActivity(installIntent);

调⽤相机的时候:

public void camera() {

Intent intent = new Intent(\"android.media.action.IMAGE_CAPTURE\");

tempFile = new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME); Uri uri;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

uri = FileProvider.getUriForFile(this, \"com.camera.fileprovider\ //此处为Uri临时授权

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else {

uri = Uri.fromFile(tempFile); }

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(intent, PHOTO_REQUEST_CAMERA); }

裁剪图⽚:

public static void cropImageUri(Activity activity, Uri orgUri, Uri desUri, int aspectX, int aspectY, int width, int height, int requestCode) { Intent intent = new Intent(\"com.android.camera.action.CROP\"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //此处为Uri临时授权

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); }

intent.setDataAndType(orgUri, \"image/*\"); //此处的Uri为 输⼊Uri⽤FileProvider的⽅式获取 intent.putExtra(\"crop\

intent.putExtra(\"aspectX\ intent.putExtra(\"aspectY\ intent.putExtra(\"outputX\ intent.putExtra(\"outputY\ intent.putExtra(\"scalerue); //将剪切的图⽚保存到⽬标Uri中

intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);//此处的Uri为输出Uri 需要⽤Uri.fromFile()的⽅式获取 intent.putExtra(\"return-data\false);

intent.putExtra(\"outputFormat\ intent.putExtra(\"noFaceDetectionrue);

activity.startActivityForResult(intent, requestCode);}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务