Android getContentResolver().query 获取文件路径NullPointerException

针对Android 6.0系统测试如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Uri fileUri = data.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };

    Cursor cursor = getContentResolver().query(fileUri, filePathColumn, null, null, null);
    cursor.moveToFirst();
    String filePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0]));
    cursor.close();
}

cursor的结果为null,查找原因,得到如下结论:

对于Android 6.0及后续版本,Uri的形式发生变化,此时如果要获取图像的路径,可以按照如下实现:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Uri fileUri = data.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };

    String filePath = null;
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        Cursor cursor = getContentResolver().query(fileUri, filePathColumn, null, null, null);
        cursor.moveToFirst();
        filePath = cursor.getString(cursor.getColumnIndex(filePathColumn[0]));
        cursor.close();
    } else {
        filePath = fileUri.getPath();
    }
}
上一篇 Android自定义广播设置只能由指定的APP接收
下一篇 Android判断应用通知权限是否开启以及跳转到设置界面
目录
文章列表
1 Linux Shell 解析xml节点的值
Linux Shell 解析xml节点的值
2
Vue访问去掉url地址栏中的#符号
Vue访问去掉url地址栏中的#符号
3
Android上使用Tesseract识别文字
Android上使用Tesseract识别文字
4
Gradle 设置 Nexus 用户名密码
Gradle 设置 Nexus 用户名密码
5
Docker 图形化工具 Portainer 使用
Docker 图形化工具 Portainer 使用
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。