从另一个应用程序获取图像的RuntimeException

时间:2017-02-02 22:47:33

标签: android android-intent intentfilter mediastore

我已将其中一项活动设置为从其他应用程序接收图像:

<activity
        android:name=".activities.GetShareImage"
        android:screenOrientation="portrait">
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>
    </activity>

并在我的应用中使用该图片。但有时我得到了这个例外:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{********.activities.GetShareImage}: java.lang.IllegalArgumentException: column '_data' does not exist

我的代码是:

Intent intent = getIntent();
    if (intent != null){

        String action   = intent.getAction();
        String type     = intent.getType();

        if(Intent.ACTION_SEND.equals(action) && type != null){

            if(type.startsWith("image/")){

                Bundle extra = intent.getExtras();
                if(extra.containsKey(Intent.EXTRA_STREAM)){

                    Uri imageUri    = extra.getParcelable(Intent.EXTRA_STREAM);


                    if (imageUri != null){

                        String Scheme   = imageUri.getScheme();

                        if(Scheme.equals("content")){


                            ContentResolver contentResolver = getContentResolver();
                            Cursor cursor = contentResolver.query(imageUri, null, null, null, null);
                            cursor.moveToFirst();

                            String ImagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
                            if (ImagePath != null) {
                                Uri imageURI = Uri.fromFile(new File(ImagePath));
                                startCropActivity(imageURI);
                            }else {


                                finish();
                            }

                        } else if (Scheme.equals("file")){

                            Uri imgUri  = Uri.parse(extra.getParcelable(Intent.EXTRA_STREAM).toString());
                            startCropActivity(imgUri);
                        }

                    } else {
                        finish();
                    }

                }

            }

        }
    }

我已经检查Uri方案以防止此问题,但似乎还不够。那么从其他应用程序获取图像的最佳方法是什么? 有没有更好的解决方案呢?

1 个答案:

答案 0 :(得分:0)

您的getType()if(myObject instanceof Piece && myObject.getClass() != Piece.class) { // do stuff } 代码都不正确。在content的情况下,您假设file知道图像并且有一个可以使用的路径,这两个路径都不一定正确。在content的情况下,您获得MediaStore,将其转换为file,然后将其转换回Uri,原因并非明显。

在这两种情况下,String Uri。除了将其传递给extra.getParcelable(Intent.EXTRA_STREAM)之外,没有必要对此做任何事情。