转载:http://blog.csdn.net/chenyk_kevin_1/article/details/52295264
相信好多人都遇到在图片选择器的使用过程中,出现了程序闪退的情况,但却不知该如何解决。而笔者在最近的开发过程中也遇到了诸如此类情况,出现了这串错误代码:
E/HAL: load: id=gralloc != hmi->id=gralloc
其实造成这一现象的主要原因是没有SD卡的读写权限,目前部分图片选择库的流程都是将在手机扫描的图片文件添加到自定义的布局中,这其中就使用到了读写权限。可是以前使用的时候没什么问题,现在怎么会闪退无法加载呢。
原来是自google出了Android 6.0之后,才导致问题的发生的。起先,笔者遇到这问题之后也是有些困惑,不知道该从何下手,最后google了之后就有点眉目,走了不少弯路,总的来说是Android 6.0 RuntimePermission的问题导致的。当targetSdkVersion<=22,那没什么问题;而如果>22呢,此时你会看到闪了一下就没有了的,logcat也没有出现任何提示,唯独显示E/HAL: load: id=gralloc != hmi->id=gralloc
这串红色代码。当然这样就好解决多了,主要有以下两种方法:
一、最简单粗暴的办法,直接将targetSdkVersion改为22或以下
defaultConfig {
targetSdkVersion 22
}
二、在使用图片选择库之前,申请相关权限即可,以下为申请步骤
1、在Androidmanifest.xml文件声明相关权限,如
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
ps:视图申请未添加申明的dangerous permissions,将导致程序crash
2、通过ContextCompat.checkSelfPermission方法检查某项权限被授予情况
//检查SD卡写权限授予情况
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
}
ps:方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回值不等于PackageManager.PERMISSION_GRANTED,即PackageManager.PERMISSION_DENIED就需要进行授权申请
3、申请授权
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUSET_CODE_WRITE_EXTERNAL_STORAGE);
ps:在Android 6.0的所有dangerous permissions,谷歌将它们进行了分组,比如授权WRITE_EXTERNAL_STORAGE权限,同组下的READ_EXTERNAL_STORAGE权限系统将默认授权
4、权限回调处理
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUSET_CODE_WRITE_EXTERNAL_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//授权成功,直接操作
} else {
//禁止授权
}
return;
}
}