-
//API <= 6.0 public static void install(Context mContext, File file) { Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); mContext.startActivity(install); } //API >= N <provider android:name="android.support.v4.content.FileProvider" android:authorities="${你的包名}.fileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> //1.在清单文件做如下申明 //2.res/xml/目录建文件 file_paths <paths xmlns:android="http://schemas.android.com/apk/res/android"> <root-path name="root" path="" /> //path:授权路径:或许该dir下面会有子文件夹 <files-path name="files" path="" /> //name: 你给这个路径取的别名,暂时这里用不上 <cache-path name="cache" path="" /> <external-path name="external" path="" /> <external-files-path name="name" path="path" /> <external-cache-path name="name" path="path" /> </paths> //<root-path/> 代表设备的根目录new File("/"); //<files-path/> 代表context.getFilesDir() //<cache-path/> 代表context.getCacheDir() //<external-path/> 代表Environment.getExternalStorageDirectory() //<external-files-path>代表context.getExternalFilesDirs() //<external-cache-path>代表getExternalCacheDirs() //3. public static void install(Context mContext, File file) { Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(mContext, "${你的的包名}.fileProvider", file); install.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } mContext.startActivity(install); } //API >=O //除了N以外的所有声明还需在清单文件申请权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> //出现原因 对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。 要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅共享文件。 https://developer.android.com/about/versions/nougat/android-7.0-changes.html#accessibility //上面个人理解是说:我将自己的apk文件路径提供给系统安装器去安装,系统安装器不一定有权限(拿不到这个apk文件),通过上面这种形式,将这个路径提供出去,让安装器可访问。 //常见问题: //1.Intent clipData 报空 就是”你的包名“这个位置值不一致导致,一定要仔细核对 //2.没有报错但就是无法启动安装界面 如果是8.0+一定要申请权限。
【Android】APK安装更新6.0 7.0 8.0+
最新推荐文章于 2021-05-26 06:46:20 发布