美文网首页
项目中AndroidQ适配解决方案

项目中AndroidQ适配解决方案

作者: 拿什么拯救我的代码 | 来源:发表于2020-04-03 23:29 被阅读0次

    由于今年AndroidQ的发布以及应用市场对sdk版本的要求,需要对目前公司维护的老旧的Android项目进行AndroidQ适配。

    遇到的问题:

    1、提升Gradle和SDK版本号

    2、AndroidManifest.xml增加权限

    3、动态获取权限

    4、项目升级时AndroidQ解决方案

    5、琐碎问题

    解决方案:

    1、提升Gradle和SDK版本号

    project   build.gradle:

    提升classpath依赖的版本号

    app  build.gradle

    compileSdkVersion  和  buildToolsVersion   提升到相应版本号

    并增加:minSdkVersion

                    targetSdkVersion

                    versionCode

                    versionName    如图

    2、AndroidManifest.xml增加权限

    原有权限不需要进行修改,增加新的权限

    <!--升级包安装权限-->

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

    <!--定位权限8.0以后兼容10-->

    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    3、动态获取权限

    再首页进行动态申请权限(涉及到版本检测和升级功能)

    private static final String[]PERMISSIONS_STORAGE = {

    Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,

          Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,

          Manifest.permission.READ_PHONE_STATE

    };//所需权限数组

    private static final int authRequestCode =1;

    //申请权限

    private void initpermission() {

        if (Build.VERSION.SDK_INT >=23) {

            if (!hasBasePhoneAuth()) {

                    this.requestPermissions(PERMISSIONS_STORAGE, authRequestCode);

             }else {

                     if (isUpdate.equals("true")) {//确定更新

                            updateClick =false;

                            checkUpdate();

                      }

               }

    }else {

    if (isUpdate.equals("true")) {//确定更新

            updateClick =false;

            checkUpdate();

          }

    }

    }

    //检查有权限

    private boolean hasBasePhoneAuth() {

    PackageManager pm =this.getPackageManager();

      for (String auth :PERMISSIONS_STORAGE) {

    if (pm.checkPermission(auth, this.getPackageName()) != PackageManager

    .PERMISSION_GRANTED) {

    return false;

          }

    }

    return true;

    }

    //申请权限回调

    @Override

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

      switch (requestCode) {

    case authRequestCode:

    System.out.println("获取权限是否成功的数量:" + grantResults.length);

            for (int ret : grantResults) {

    if (ret ==0) {

    continue;

                }else {

    return;

                }

    }

    initpermission();

    break;

      }

    }

    4、项目升级时AndroidQ解决方案

    AndroidManifest.xml的修改

     <provider

      android:name="android.support.v4.content.FileProvider"

        android:authorities="包名(applicationId).fileProvider"

        android:exported="false"

        android:grantUriPermissions="true">

            android:name="android.support.FILE_PROVIDER_PATHS"

            android:resource="@xml/file_paths" />

    </provider>

    file_paths内容

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

    <paths>

    <!-- Context.getFilesDir() + "/path/" -->

    <files-path

                name="my_files"

                path="mazaiting/"/>

    <!-- Context.getCacheDir() + "/path/" -->

    <cache-path

                name="my_cache"

                path="mazaiting/"/>

    <!-- Context.getExternalFilesDir(null) + "/path/" -->

    <external-files-path

                name="external-files-path"

                path="mazaiting/"/>

    <!-- Context.getExternalCacheDir() + "/path/" -->

    <external-cache-path

                name="name"

                path="mazaiting/" />

    <!-- Environment.getExternalStorageDirectory() + "/path/" -->

    <external-path

                name="my_external_path"

                path="mazaiting/"/>

    <!-- Environment.getExternalStorageDirectory() + "/path/" -->

    <external-path

                name="files_root"

                path="Android/data/包名(applicationId)/"/>

    <!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/" -->

    <external-path

                name="external_storage_root"

                path="."/>

    </paths>

    </resources>

    UpdateDataManager.java 中apk安装方法

    /**

    * 安装APK文件

    */

    private void installApk() {

    File apkfile =new File(UtilTool.APK_DOWNLOAD_PATH, apkName);

        if (!apkfile.exists()) {

    return;

        }

    //获取下载文件的Uri

        Intent intent =new Intent(Intent.ACTION_VIEW);

        //7.0 以上需要FileProvider进行设置

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

    Uri apkUri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID +".fileProvider", apkfile);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

            intent.setDataAndType(apkUri, mContext.getContentResolver().getType(apkUri));

        }else {

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive");

        }

    mContext.startActivity(intent);

    }

    5、琐碎问题

    升级到Android Q之后项目中获取imei的方法会进行报错

    UtilTool.java 

    /**

    * 获取imei号

    *

    * @param context

    * @return

    */

    public static StringgetIMEI(Context context) {

    TelephonyManager telephonyManager = (TelephonyManager) context

    .getSystemService(Context.TELEPHONY_SERVICE);

      if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {

    // TODO: Consider calling

          //    ActivityCompat#requestPermissions

          // here to request the missing permissions, and then overriding

    //  public void onRequestPermissionsResult(int requestCode, String[] permissions,

    //                                          int[] grantResults)

    // to handle the case where the user grants the permission. See the documentation

    // for ActivityCompat#requestPermissions for more details.

          return null;

      }

    String imei = telephonyManager.getDeviceId();

      return imei;

    }

    BaiduMap

    百度地图

    引用baidumapapi_v3_5_0.jar包中的方法时原有方法不能使用了

    要引用另外一个

    SDKInitializer.initialize(this);


    以上是公司一些陈旧的项目,偶尔进行维护细节优化时需要进行Android Q适配的解决方案

    相关文章

      网友评论

          本文标题:项目中AndroidQ适配解决方案

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