记录Android 迁移到AndroidX时的步骤和注意事项

写在前面:

备份!备份!备份! 重要的事情说三遍

项目场景:

Android项目迁移到AndroidX

问题描述:

项目在 Android 10获取相册图片和拍照时无法获取到文件路径,进而使app崩溃。 我使用的拍照裁剪的库是:
api 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'

原因分析:

由于当前依赖库没有使用最新的2.5.3,所以导致项目没有适配到Android10,进而使得读取相册文件路径时出现FileNotFoundException e java.io.FileNotFoundException: /storage/emulated/0/Pictures/xxxxx.jpg: open failed: EACCES (Permission denied)的问题。【首先声明这个问题不是由于没有动态获取权限导致的,也就是说
//清单文件中已添加
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
//activity中权限动态申请
  String[] permissionArr = new String[]{
            //相机权限
            Manifest.permission.CAMERA,
            //SD卡读写操作
            Manifest.permission.READ_EXTERNAL_STORAGE,
          };

    //动态权限已申请
        PermissionsUtils.getInstance().checkPermissions(this, permissionArr, new PermissionsUtils.IPermissionsResult() {
            @Override
            public void passPermissions() {

            }

            @Override
            public void forbidPermissions() {
            }
        });

   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PermissionsUtils.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }

排查后是由于拍照裁剪库未更新到最新导致的。

解决方案:

升级拍照裁剪库到2.5.3
 api 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.3'

此时由于这个库已经使用了AndroidX而我的项目还是Android的,所以就出现了如下问题:

升级后的报错信息
这一看,这项目是不得不升级到AndroidX了呀,所以就开始查找文章开始操作,没想到一顿操作猛如虎,简直就是二百五。不过好在操作之前做了备份【一定要先备份!备份!备份!】

Android迁移AndroidX:

1、 gradle.properties文件中添加

# 表示使用 androidx
android.useAndroidX=true
# 表示将第三方库迁移到 androidx
android.enableJetifier=true

点击右上角Sync Now

2、 Android Studio 一键迁移
迁移步骤
然后就一路操作就可以了。
你以为这样就结束了吗?NO NO NO

3、 将项目中support未导入或导入出错的包手动查找导入
有文章说全文搜索,将support.v搜索一遍,将项目中所有support包替换成对应的androidX库就可以了,但是我采用这种方法没有替换干净,所以只能哪里报错去哪里手动导入。

recyclerview、drawlayout、viewpager、tablayout、ConstraintLayout自动导入的那个包文件不对,需要替换,目前我用到的是这几个。

到此就可以了。

遇到的坑:

1、清单文件中权限重复,导致一直提示Manifest merger failed with multiple errors, see logs
解决方法:tetminal中输入

gradlew processDebugManifest -stacktrace 

查看详细信息,挨个解决就可以了。
2、各module中sdkVersion不一致导致的
解决方法:修改统一即可
3、Unable to start the daemon process. This problem might be caused by …
解决方法:
1、将安装C盘的.gradle目录删除掉
2、设置gradle.properties,若无就新增。
在文件中添加如下配置信息:

	org.gradle.jvmargs=-Xmx512m 

3、新建系统变量
变量名 _JAVA_OPTIONS
变量值 -Djava.net.preferIPv4Stack=true
【网上的方法 修改或者配置gradle文件没有成功解决的 可以试试这个方法!】

写在最后:

利用好Android Studio中的 Clean Project 和 Invalidate Caches/Restart…

原创不易,欢迎指正,不喜勿碰,谢谢!

猜你喜欢

转载自blog.csdn.net/lzllzllhl/article/details/108461777