android 安装apk 遇到的问题

2019-07-10  本文已影响0人  程序员阿兵

很多应用都是采用内部下载的方式,版本升级后可以实时更新最新应用,这样的体验肯定比跳转到浏览器好得多!而应用商店审核周期长,所以内部下载更新就显得尤为重要!

下面是Android不同版本需要适配安装的问题:

具体代码:

/**
   * 兼容8.0安装位置来源的权限
   */
  private void installApk(Context context, String downloadApkPath) {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          //是否有安装位置来源的权限
          boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();
          if (haveInstallPermission) {
              AppUtils.installApk(context, downloadApkPath);
          } else {
              new ResolveInstallDialog(context, "安装应用需要打开安装未知来源应用权限,请去设置中开启权限", new ResolveInstallDialog.OnOkListener() {
                  @Override
                  public void onOkClick() {
                    Uri packageUri = Uri.parse("package:"+ AppUtils.getAppPackageName());
                      Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageUri);
                  }
              }).show();
          }
      } else {
          AppUtils.installApk(context, downloadApkPath);
      }
  }

具体安装代码:

   /**
     * 根据安装包路径安装apk
     *
     * @param mContex 上下文
     * @param apkPath apk路径
     */
    public static void installApk(Context mContex, String apkPath) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File apkFile = new File(apkPath);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(
                    mContex
                    , mContex.getPackageName()+".accomponentcheckupdate.provider"
                    , apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        mContex.startActivity(intent);
    }

7.0 配置fileProvider

新建xml目录创建 fileprovider

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="." name="external_storage_root" />
</paths>

自定义FileProvider

public class ACComponentItemCheckUpDateFileProvider extends FileProvider {

}

在manifest 配置FileProvider

    <application>

        <service
            android:name=".update.VersionUpdateService"
            android:process=":versionUpdateService" />
        <provider
            android:authorities="${applicationId}.accomponentcheckupdate.provider"
            android:name=".ACComponentItemCheckUpDateFileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
上一篇下一篇

猜你喜欢

热点阅读