IllegalArgumentException:无效的列纬度

HB.*_*HB. 6 java android

按照文档, 我尝试查询ContentResolver以获取文件大小,如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == video_request_code) {
        if (resultCode == RESULT_OK) {
            Uri uri = data.getData();
            Cursor cur = getContentResolver().query(uri, null, null, null, null);
            try {
                if (cur != null && cur.moveToFirst()){
                    if (uri.getScheme() != null){
                        if (uri.getScheme().equals("content")) {
                            int sizeIndex = cur.getColumnIndex(OpenableColumns.SIZE);
                            Log.e("size", ""+cur.getLong(sizeIndex));
                        }else if (uri.getScheme().equals("file")) {
                            File ff = new File(uri.getPath());
                            Log.e("size", ""+ff.length());
                        }
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            finally {
                if (cur != null)
                    cur.close();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

java.lang.IllegalArgumentException: Invalid column latitude
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: Invalid column latitude
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
        at android.content.ContentResolver.query(ContentResolver.java:944)
        at android.content.ContentResolver.query(ContentResolver.java:880)
        at android.content.ContentResolver.query(ContentResolver.java:836)
        at com.my.package.MainActivity.onActivityResult(MainActivity.java:146)
        ...
Run Code Online (Sandbox Code Playgroud)

崩溃指向Cursor cur = getContentResolver().query(uri, null, null, null, null);,但正如您所看到的,我不是在查询纬度列。事实上,在崩溃的时候,我没有查询任何列。

在运行 Android 10 的设备上从 Google Photo 选择文件时,我只能重现这一点。


我的问题:

为什么会发生这种情况,我该如何克服?


编辑:

我尝试通过列的投影。为了测试,我通过了以下内容:

java.lang.IllegalArgumentException: Invalid column latitude
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: Invalid column latitude
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
        at android.content.ContentResolver.query(ContentResolver.java:944)
        at android.content.ContentResolver.query(ContentResolver.java:880)
        at android.content.ContentResolver.query(ContentResolver.java:836)
        at com.my.package.MainActivity.onActivityResult(MainActivity.java:146)
        ...
Run Code Online (Sandbox Code Playgroud)

但我仍然得到同样的错误。

小智 -3

我找到了解决方案

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Run Code Online (Sandbox Code Playgroud)

当我使用它时,它显示了问题。

Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("video/*");
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
Run Code Online (Sandbox Code Playgroud)

这很有效,您将获得大小和临时文件路径。

请查阅这些链接。

https://github.com/ivpusic/react-native-image-crop-picker/blob/95b9ba77181b627c8dd1c27369b21a3c69dc4a3d/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java#L369

https://github.com/ivpusic/react-native-image-crop-picker/blob/master/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java

手指交叉。