欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-08 11:07:27
...

写在前面:

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

项目场景:

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的,所以就出现了如下问题:

记录Android 迁移到AndroidX时的步骤和注意事项
这一看,这项目是不得不升级到AndroidX了呀,所以就开始查找文章开始操作,没想到一顿操作猛如虎,简直就是二百五。不过好在操作之前做了备份【一定要先备份!备份!备份!】

Android迁移AndroidX:

1、 gradle.properties文件中添加

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

点击右上角Sync Now

2、 Android Studio 一键迁移
记录Android 迁移到AndroidX时的步骤和注意事项
然后就一路操作就可以了。
你以为这样就结束了吗?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…

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