配置文件
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.xx.xx.fileProvider" //包名加.fileProvider android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
file_paths.xml文件
<resources> <paths> <external-path name="name" path="myapp" /> </paths> <!--path:需要临时授权访问的路径(.代表所有路径),属性值不能使用具体的独立文件名,只能是目录名--> <!--name:就是给 path 属性所指定的子目录名称取一个别名,后续生成 content:// URI 时, 会使用这个别名代替真实目录名。这样做的目的,是为了提高安全性--> <!--外部存储又分为SD卡和扩展卡内存,此处外部存储空间对应为内置SD卡内存--> <!--内部存储,我们称为InternalStorage,外部存储我们称为ExternalStorage--> <!--<files-path>:内部存储空间应用私有目录下的 files/ 目录,等同于 Context.getFilesDir() 所获取的目录路径;--> <!--<cache-path>:内部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getCacheDir() 所获取的目录路径;--> <!--<external-path>:外部存储空间根目录,等同于 Environment.getExternalStorageDirectory() 所获取的目录路径;--> <!--<external-files-path>:外部存储空间应用私有目录下的 files/ 目录,等同于 Context.getExternalFilesDir(null) 所获取的目录路径;--> <!--<external-cache-path>:外部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getExternalCacheDir();--> </resources>
java代码
Uri fileuri; Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT>=24){
fileuri = FileProvider.getUriForFile(this,"com.xx.xx.fileProvider",new File(Environment.getExternalStorageDirectory() + "/myapp", "appname.apk"));
}else{
fileuri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/myapp", "appname.apk")); } intent.setDataAndType(fileuri, "application/vnd.android" + ".package-archive");
startActivity(intent);
9.0好像默认不支持http所以在配置文件中的application添加
android:usesCleartextTraffic="true"
这样9.0以下的安装apk基本没得问题了。
Uri 中的路径一定要是你apk的下载路径.