调用 外部程序对 自己的程序创建的文件的操作,用 FileProvider 对象加密本地文件地址!仅仅授权 Uri 给外部程序
Uri photoURI = FileProvider.getUriForFile(this, getPackageName() + “.provider”, pictureFile);
本地创建的文件给 FileProvider 用于创建 uri 加密链接
File storageDir=getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image=File.createTempFile(imageFileName,".jpg",storageDir);
注册 一个xml ,来定义目录
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="my_images"
path="Android/data/com.jackamcc.captureimgfileprovider/files/Pictures" />
</paths>
在 AndroidManifest.xml 中注册
…
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
在调用外部程序的时候,授权 该 Uri
创建临时授权的url
List resInfoList = getPackageManager().
queryIntentActivities(intent, PackageManager.
MATCH_DEFAULT_ONLY);
if (resInfoList.size() == 0) {
return;
}
//为未知的剪切程序设置 权限
Iterator resInfoIterator = resInfoList.iterator();
while (resInfoIterator.hasNext()) {
ResolveInfo resolveInfo = (ResolveInfo) resInfoIterator.next();
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, **photoURI_2**,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//授权的 图片的 Uri 不同, 没有授权的 uri 将不能被 保存.
}
第一个 坑 :这里的坑就在于,每次用 Url 时候都需要授权该,Url
这样 intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI_2);
中 photoURI_2 才能正确指向本地真实的文件位置
第二个 坑: Uri.fromFile(imageOld) 没有授权没法正确使用
表面上是说,不让你看到真实目录,实际上.是还要得到目录的同时
进行授权.
而 Uri.fromFile(imageOld) 是一个临时的 Url 没法获得授权.