如果你的安卓程序的targetSdkVersion是24以上,也就是7.0。你需要使用FileProvider向其他应用提供文件,而不是随便地利用文件地址就可以。也就是说你需要使用 content://
来代替file://
。接下来提供步骤:
- 你最好提供自己的FileProvider扩展,而不是直接使用android.support.v4.content.FileProvider,以防止与其他app和库冲突。
public class MyFileProvider extends FileProvider {
}
- 接下来,在AndroidManifest.xml中,添加一个provider标签
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name=".MyFileProvider"
android:authorities="${applicationId}.my.package.name.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>
- 你应该注意到,其中有一个xml资源,没错,你需要定义一个xml文件来说明你需要提供的文件路径
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
在这个例子中,我们指出需要获取外部储存的根路径,用.
表示。
- 最后,你就可以获取文件Uri了,注意,你需要
FLAG_GRANT_READ_URI_PERMISSION
权限来完成这个工作。比如在intent中,获取uri地址来安装apk:
Intent intent= new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileProvider", apkfile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
startActivity(intent);