美文网首页
APP自动安装 --踩坑记录

APP自动安装 --踩坑记录

作者: Journey_lm | 来源:发表于2020-10-29 08:14 被阅读0次

    前段时间电脑升级,脑残的也罢android studio也给升级到了最新版 'com.android.tools.build:gradle:3.4.2',android sdk 28.0.3 (9.0)导致项目中android support 包基本上不能用,需要更新到 androidx ,更换包也在别人博客中找到了解决办法 https://blog.csdn.net/chenhuakang/article/details/90267389, 更新后还是发现一些坑。

    1、APP访问本地文件时找不到路径

    androidx后,发现清单文件中配置不一样,

    (1)配置清单文件
    <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/provider_paths" />
          </provider>
    

    改动后

    <provider
              android:name="androidx.core.content.FileProvider"
              android:authorities="你的包名.fileprovider"
              android:exported="false"
              android:grantUriPermissions="true">
              <meta-data
                  android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/provider_paths" />
          </provider>
    
    (2)在res中建立一个xml文件夹,在文件夹中创建filepaths.xml文件
      <?xml version="1.0" encoding="utf-8"?>
      <paths>
          <external-cache-path
              name="external_cache_path"
              path="" />
       
      </paths>
    
    (3)需要在访问文件时判断版本来获取对应的路径,比如查看本地相册时
    /**
       * 开启相机
       */
      public void openCamera() {
          Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          File file = new File(mContext.getExternalCacheDir(), getPhotoFileName());
          photoFileName = file.getAbsolutePath();
          Uri uri;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              uri = FileProvider.getUriForFile(mContext.getApplicationContext(),mContext.getPackageName() + ".fileprovider", file);
          } else {
              uri = Uri.fromFile(file);
          }
          intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
          ((Activity)mContext)startActivityForResult(intentphotograph, requestCode);
      }
    

    2、在做应用版本自动更新时,发现不能自动安装,调不起来安装的apk。现在后的文件路径都正常,就是打不开应用。

    最终发现android 8.0以后有了一个权限叫安装未知应用或者是安装未知来源应用,如下图

    b.png
    a.png

    如果想让应用自动安装下载的新版本apk,那么必须打开应用的这个权限,不然是不会自动安装的。代码中的打开方式

    // 安装下载后的apk文件
      private void Instanll(String path, Context context) {
          Util.SystemToPrintln(TAG, "file=============" + path,
                  2);
          boolean haveInstallPermission;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              //先获取是否有安装未知来源应用的权限
              haveInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
              if (!haveInstallPermission) {//没有权限
                  AlertDialog alertDialog = new AlertDialog.Builder(mContext)
                          .setTitle("请开启未知来源权限")
                          .setMessage("应用需要打开安装未知来源应用权限,请去设置中开启权限")
                          .setCancelable(false)
                          .setNegativeButton(mContext.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  dialog.dismiss();
                                  Toast.makeText(mContext,"您拒绝了权限,应用无法正常使用!",Toast.LENGTH_SHORT);
                              }
                          })
                          .setPositiveButton(mContext.getResources().getString(R.string.gosystem), new DialogInterface.OnClickListener() {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  dialog.dismiss();
                                  toInStallPermissionSettingActivity();
                              }
                          }).create();
                  alertDialog.show();
                  return;
              }
          }
          if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判读版本是否在7.0以上
              Uri apkUri = FileProvider.getUriForFile(context, "包名.fileprovider", new File(path));//在AndroidManifest中的android:authorities值
              Intent install = new Intent(Intent.ACTION_VIEW);
              install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
              install.setDataAndType(apkUri, "application/vnd.android.package-archive");
              context.startActivity(install);
          } else{
              Intent intent = new Intent(Intent.ACTION_VIEW);
              intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              intent.setDataAndType(Uri.fromFile(new File(path)),
                      "application/vnd.android.package-archive");
              ((Activity)mContext).startActivity(intent);
          }
      }
    
      @RequiresApi(api = Build.VERSION_CODES.O)
      private void toInStallPermissionSettingActivity() {
          Uri packageURI = Uri.parse("package:" + mContext.getPackageName());
          //注意这个是8.0新API
          Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
          ((Activity)mContext).startActivityForResult(intent, 1);
      }
    

    好了,完美解决

    相关文章

      网友评论

          本文标题:APP自动安装 --踩坑记录

          本文链接:https://www.haomeiwen.com/subject/irjajctx.html