Android兼容android7.0、及Android8.0以上apk安装权限问题(二)
16lz
2022-01-16
上篇文章地址
Android 一个简单的App版本更新功能的实现,页面可自定义(一)
最近在完善一个之前做的版本更新的功能
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent);
发现上述代码在7.0及以上的手机会出现问题,所以在这里做了兼容7.0,及8.0以上的安卓系统
使用 FileProvider 设置存储路径,可兼容7.0以上
- 在AndroidManifest中添加provider和权限
<application ...> <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"/> </provider></application><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
- 在res下创建xml文件夹,接着在xml文件夹中传教file_paths.xml文件
<paths> <external-path name="external_files" path="." /></paths>
- 同时兼容7.0以下和7.0
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android7.0及以上版本 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //Uri contentUri = FileProvider.getUriForFile(mContext, "应用包名" + ".fileProvider", file);//参数二:应用包名+".fileProvider"(和步骤一中的Manifest文件中的provider节点下的authorities对应) Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileprovider", file); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { // Android7.0以下版本 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } mContext.startActivity(intent);
兼容8.0以上
- 让用户允许安装权限,允许成功之后可版本更新
@RequiresApi(api = Build.VERSION_CODES.O) private boolean isHasInstallPermissionWithO(Context context) { if (context == null) { return false; } return context.getPackageManager().canRequestPackageInstalls(); } /** * 开启设置安装未知来源应用权限界面 * * @param context */ @RequiresApi(api = Build.VERSION_CODES.O) private void startInstallPermissionSettingActivity(Context context) { if (context == null) { return; } Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES); startActivityForResult(intent, REQUEST_CODE_APP_INSTALL); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case REQUEST_CODE_APP_INSTALL: if (!StringUtils.isEmpty(url)) { //下载apk DownloadApk.getInstance().downLoadApk(MainActivity.this, url); } break; } } }
- 适配8.0以上及8.0以下
//适配Android8.0以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean hasInstallPermission = isHasInstallPermissionWithO(MainActivity.this); if (!hasInstallPermission) { showRequestPermissionDialog(); } else { //下载apk DownloadApk.getInstance().downLoadApk(MainActivity.this, url); } } else { //Android8.0以下 //下载apk DownloadApk.getInstance().downLoadApk(MainActivity.this, url); }private void showRequestPermissionDialog() { CommonDialog requestPermission = new CommonDialog(this, "您还没有允许应用安装未知应用权限", "是否去允许", "是", "否", new OnMyPositiveListener() { @Override public void onClick() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //跳转页面判断允许安卓位置应用权限 startInstallPermissionSettingActivity(MainActivity.this); } } }, new OnMyNegativeListener() { @Override public void onClick() { super.onClick(); } }); requestPermission.show(); }
项目下载地址
添加链接描述
更多相关文章
- Android崩溃后重启
- Android开机广播和关机广播
- Android在WebView上构建Web应用程序
- Android(安卓)检测SD卡应用
- Android(安卓)横竖屏操作
- Android清除本地数据缓存代码
- [连载 1/15] Android(安卓)从入门到精通Example 之 TextBox
- Android(安卓)Shell命令dumpsys
- Android配置----Eclipse+BlueStacks调试Android应用