-
Notifications
You must be signed in to change notification settings - Fork 3k
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