如果你的安卓程序的targetSdkVersion是24以上众羡,也就是7.0慈参。你需要使用FileProvider向其他應(yīng)用提供文件暴匠,而不是隨便地利用文件地址就可以蔚携。也就是說你需要使用 content://
來代替file://
精耐。接下來提供步驟:
- 你最好提供自己的FileProvider擴(kuò)展狼速,而不是直接使用android.support.v4.content.FileProvider,以防止與其他app和庫沖突卦停。
public class MyFileProvider extends FileProvider {
}
- 接下來向胡,在AndroidManifest.xml中,添加一個(gè)provider標(biāo)簽
<?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>
- 你應(yīng)該注意到惊完,其中有一個(gè)xml資源僵芹,沒錯(cuò),你需要定義一個(gè)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>
在這個(gè)例子中专执,我們指出需要獲取外部儲(chǔ)存的根路徑淮捆,用.
表示。
- 最后本股,你就可以獲取文件Uri了攀痊,注意,你需要
FLAG_GRANT_READ_URI_PERMISSION
權(quán)限來完成這個(gè)工作拄显。比如在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);