Android兼容android7.0、及Android8.0以上apk安装权限问题(二)

上篇文章地址

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以上
  1. 在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"/>
  1. 在res下创建xml文件夹,接着在xml文件夹中传教file_paths.xml文件
<paths>
    <external-path name="external_files" path="." />
</paths>
  1. 同时兼容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以上
  1. 让用户允许安装权限,允许成功之后可版本更新
@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;
            }
        }
    }
  1. 适配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)