Android 从库中选择图像并在图像视图中显示?

Android 从库中选择图像并在图像视图中显示?,android,Android,我正在开发一个应用程序,它要求用户从图库中选择一张照片,并将其设置为个人资料图片。现在,下面的代码在我在摩托罗拉Moto G、One plus X、MI 4i和其他一些设备上检查过的大多数设备上都正常工作。每当我在redmi prime上运行它时,它都会给出一个如下所述的错误: 堆栈跟踪 进程:com.example.lordvoldemort.imagepicker,PID:23291 java.lang.RuntimeException:传递结果失败 ResultInfo{who=null,

我正在开发一个应用程序,它要求用户从图库中选择一张照片,并将其设置为个人资料图片。现在,下面的代码在我在摩托罗拉Moto G、One plus X、MI 4i和其他一些设备上检查过的大多数设备上都正常工作。每当我在redmi prime上运行它时,它都会给出一个如下所述的错误:

堆栈跟踪

进程:com.example.lordvoldemort.imagepicker,PID:23291 java.lang.RuntimeException:传递结果失败 ResultInfo{who=null,request=1,result=-1,data=Intent{ dat=file:///storage/emulated/0/DCIM/Camera/IMG_20160807_003845_HDR.jpg typ=image/jpeg}}到活动 {com.example.lordvoldemort.imagepicker/com.example.lordvoldemort.imagepicker.MainActivity}: java.lang.NullPointerException:尝试调用接口方法 空对象上的“boolean android.database.Cursor.moveToFirst” 参考 在android.app.ActivityThread.deliverResultsActivityThread.java:3595 在 android.app.ActivityThread.handleSendResultActivityThread.java:3638 在android.app.ActivityThread.access$1300ActivityThread.java:154 在 android.app.ActivityThread$H.handleMessageActivityThread.java:1366 位于android.os.Handler.dispatchMessageHandler.java:102 在android.os.Looper.Looper.java:135 在android.app.ActivityThread.mainActivityThread.java:5290 在java.lang.reflect.Method.Invokenactive方法中 位于java.lang.reflect.Method.invokeMethod.java:372 在 java:908 位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:703 原因:java.lang.NullPointerException:尝试调用接口 方法“boolean android.database.Cursor.moveToFirst”位于空 对象引用 在 com.example.lordvoldemort.imagepicker.MainActivity.onActivityResultMainActivity.java:104 在android.app.Activity.dispatchActivityResultActivity.java:6241 在android.app.ActivityThread.deliverResultsActivityThread.java:3591 在 android.app.ActivityThread.handleSendResultActivityThread.java:3638 在android.app.ActivityThread.access$1300ActivityThread.java:154 在 android.app.ActivityThread$H.handleMessageActivityThread.java:1366 位于android.os.Handler.dispatchMessageHandler.java:102 在android.os.Looper.Looper.java:135 在android.app.ActivityThread.mainActivityThread.java:5290 在java.lang.reflect.Method.Invokenactive方法中 位于java.lang.reflect.Method.invokeMethod.java:372 在 java:908 访问com.android.internal.os.Zyg java:703

我在ActivityResult上使用的代码-

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

                    Cursor cursor = getContentResolver()
                            .query(selectedImage, filePathColumn, null,
                                    null, null);
                    assert cursor != null;
                    cursor.moveToFirst();

                    int columnIndex = cursor
                            .getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    cursor.close();

                    newbitmap = BitmapFactory.decodeFile(filePath);
                    ImageView ivImage = (ImageView)findViewById(R.id.image);
                    ivImage.setImageBitmap(newbitmap);


 public String getPathFromURI(Uri contentUri) {
        String res = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
        }
        cursor.close();
        return res;
    }
错误是- 尝试对空对象引用调用接口方法“boolean android.database.Cursor.moveToFirst”

现在,以下代码在大多数设备上正常工作

我怀疑它能在很少的设备上可靠地工作。这在一定程度上取决于Uri来自何处

错误是-尝试对空对象引用调用接口方法“boolean android.database.Cursor.moveToFirst”

这是因为MediaStore无法识别Uri。您的getPathFromURI将在少数设备上对少数Uri值起作用,不过,这同样取决于Uri的来源


。Uri不需要有任何实际路径,除了stackoverflow.com Web服务器上的路径/questions/39355114/从gallery中选择图像,并在imageview中显示文件外,该视图是该问题URL的路径部分。

那么像Whataspp或facebook这样的大公司如何在完全相同的设备上运行呢??我的工作一定有不足之处code@AmanVerma:那么像WhatApp或facebook这样的大公司如何在完全相同的设备上运行呢最有可能的是他们。例如,像毕加索这样的大多数图像加载库都知道如何使用Uri。在您的情况下,如果您打算长期使用图像,您可能需要制作图像的本地副本。在Android 4.4+上,您可以使用ACTION_OPEN_DOCUMENT、via,然后使用takePersistableUriPermissions长期访问内容。您仍然获得一个Uri,并且您仍然将该Uri用于图像加载库或手动使用ContentResolver。您得到解决方案了吗?面对同样的错误