参阅博客: https://blog.csdn.net/g777520/article/details/89242892
我所遇到的问题是
在安卓版本下载更新6.0测试可用 ,但是在7.0版本显示下载失败 使用到ContentProvider的子类FileProvider类
在百度找到版本差异API (可以用到)
一.首先我们在清单文件注册我们的provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" /> <!--7.0配置文件路径 我放在了xml下的file_paths中-->
</provider>
二.res/xml//file_paths 这个需要自己创建自己写
这个就是我在xml文件里写的
name是代表生成的新uri的时候的拼接名称,path代表前面参数路径后拼接的内容
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="app" path="/" />
</paths>
这只是我用到的,具体如下(这一段是拷贝大佬的,帖子顶上已附链接)
参数 | 说明 |
---|---|
files-path | 调用context.getFilesDir()路径下的文件 例 /data/user/0/包名/files |
cache-path | 调用context.getCacheDir()路径下的文件 例 /data/user/0/包名/cache |
external-cache-path | 调用context.getExternalCacheDir()路径下的文件 例 /storage/emulated/0/Android/data/包名/cache |
external-files-path | 调用context.getExternalFilesDir(String)路径下的文件 例 /storage/emulated/0/Android/data/包名/files/Music |
external-path | 调用Environment.getExternalStorageDirectory()路径下的文件 例 /storage/emulated/0 |
三.最后就是我们在代码中的使用
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android4.0以后加上该代码防止在安装过程中直接退出
if (Build.VERSION.SDK_INT >= 24) { //在这里判断我们Android版本
intent.setDataAndType(FileProvider.getUriForFile(当前页面,"包名.fileprovider", fileInfo), "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(fileInfo), "application/vnd.android.package-archive");
}
// 授予目录临时共享权限
//临时读取和临时写入
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(intent);
最后要注意provider的名字代码和清单文件一致,注意provider唯一性