Skip to content

PictureSelector 2.0 常见错误

Luck edited this page Jan 9, 2022 · 1 revision

重要说明

 *** 关于部分华为Android 10及以上机型,会出现loading时间较长或者图片加载不出来的问题,这个很大程度是厂商兼容性问题
 *** 另外我看Glide也经常在华为部分 Android 10上面一直加载不出来图片,本质上问题应该是一致的

 * 现提供两者解决方案;

 1、targetSdkVersion <= 28; 
 2、如果targetSdkVersion = 29 application再加上 android:requestLegacyExternalStorage="true"
 
* 初步排查原因是 如果频繁使用 getContentResolver().openInputStream();方法,就可能导致阻塞,具体原因还未知...

* 解答:为什么其他库没问题?
1、因为其他库只是返回图片资源给使用者,内部并没有处理压缩、裁剪、拷贝资源至应用内部存储中,所有基本没用到getContentResolver();内容访问者;
2、另外大多targetSdkVersion都是28或者(29且android:requestLegacyExternalStorage="true");所以并没有开启沙盒机制等环境;


 重要:PictureSelector.create();调用此方法时,
 在activity中传activity.this,在fragment中请传fragment.this,
 影响回调到哪个地方的onActivityResult()。

 问题一:
    Android 11系统请在AndroidManifest.xml添加如下代码,适配拍照相关功能
    <!--适配Android R包可见性 开始-->
    <queries package="${applicationId}">
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
        <intent>
            <action android:name="android.media.action.ACTION_VIDEO_CAPTURE" />
        </intent>
    </queries>
    <!--适配Android R包可见性 结束-->
 

问题二:
经测试在小米部分低端机中,Fragment调用PictureSelector 2.0 拍照有时内存不足会暂时回收activity,
导致其fragment会重新创建 建议在fragment所依赖的activity加上如下代码:
if (savedInstanceState == null) {
      // 添加显示第一个fragment
      	fragment = new PhotoFragment();
      		getSupportFragmentManager().beginTransaction().add(R.id.tab_content, fragment,
                    PictureConfig.FC_TAG).show(fragment)
                    .commit();
     } else { 
      	fragment = (PhotoFragment) getSupportFragmentManager()
          .findFragmentByTag(PictureConfig.FC_TAG);
}
这里就是如果是被回收时,则不重新创建 通过tag取出fragment的实例。
 

 
问题三:
如果出现如下Invoke-customs are only supported starting with Android O (--min-api 26) 错误
请在app目录下的build.gradle android{ }末尾添加    
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
 问题四:
 bug:UCropActivity继承AppCompatActivity没有添加Theme会出现一个下面的bug
java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request 
Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
 解决:1.在styles文件中添加去掉ActionBar的theme

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
在Manifest.xml中,修改UCropActivity的theme
<activity
        android:name="com.yalantis.ucrop.UCropActivity"
         android:theme="@style/AppTheme.NoActionBar" />
 
 问题五:
 如果出现图片全部加载不出来的情况时,包括预览、相册列表等,一定要传入
 loadImageEngine(GlideEngine.createGlideEngine()); //图片加载引擎,必传项,
 也可以自定义成除glide外的其他第三方加载框架,具体请参考Demo