【问题标题】:Android KitKat Image selecting not returning anythingAndroid KitKat 图像选择不返回任何内容
【发布时间】:2014-04-09 19:54:11
【问题描述】:

我一直在尝试获取在 KitKat 的图库中选择的图像的绝对图像路径,但似乎没有成功。无论我做什么,我的变量IMAGE_FILEPATH 总是“”。这是我的onActivityResult()的代码

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

    if (resultCode != Activity.RESULT_OK) return;
    if (null == data) return;
    Uri originalUri = null;
    if (requestCode == 1) {
        //JB!!!
            Uri uri = data.getData();

            if (uri != null) {

                try {
                    // User had pick an image.
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver()
                            .query(uri,
                                    filePathColumn, null, null, null);

                    cursor.moveToFirst();

                    IMAGE_FILEPATH = cursor.getString(0);
                    cursor.close();
                } catch (Exception e) {
                    Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
                }
            }
    } else if (requestCode == 2) {
        //KK!!!
            Uri uri = data.getData();

            if (uri != null) {
                try {
                    if( uri == null ) {
                        IMAGE_FILEPATH = uri.getPath();
                    } else {
                        String[] projection = { MediaStore.Images.Media.DATA };
                        Cursor cursor = managedQuery(uri, projection, null, null, null);
                        if( cursor != null ){
                            int column_index = cursor
                                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            cursor.moveToFirst();
                            IMAGE_FILEPATH =  cursor.getString(column_index);
                        } else {
                            IMAGE_FILEPATH = uri.getPath();
                        }
                    }


                } catch (Exception e) {
                    Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
                }
            }
    }
    Resource.toast(IMAGE_FILEPATH);

    super.onActivityResult(requestCode, resultCode, data);
}

怎么了?我尝试了多种解决方案,但似乎没有任何效果。

【问题讨论】:

    标签: java android return android-image android-4.4-kitkat


    【解决方案1】:

    moveToFirst 返回一个布尔值,指示移动到该位置是否产生数据。

    boolean haveData;
    haveData = cursor.moveToFirst();
    
    if (haveData) {
     cursor.getString(.....
    

    这就是你应该做的,这是一种很好的防御性编程。现在,为什么你的光标是空的,这将需要更多地挖掘你的 contentResolver。

    【讨论】:

      【解决方案2】:

      在 KitKat 中,Gallery 会返回这样的 URI:content://com.android.providers.media.documents/document/image:1

      而不是:

      content://media/external/images/media/1
      

      因此,您可以在 KK 下编写以下内容以使其正常工作:

      if (uri != null) {
          try {
              if( uri == null ) {
                  IMAGE_FILEPATH = uri.getPath();
              } else {
                  // get the id of the image selected by the user
                  String wholeID = DocumentsContract.getDocumentId(data.getData());
                  String id = wholeID.split(":")[1];
      
                  String[] projection = { MediaStore.Images.Media.DATA };
                  String whereClause = MediaStore.Images.Media._ID + "=?";
                  Cursor cursor = getContentResolver().query(getUri(), projection, whereClause, new String[]{id}, null);
                  if( cursor != null ){
                      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                      if (cursor.moveToFirst()) {
                          IMAGE_FILEPATH = cursor.getString(column_index);
                      }
      
                      cursor.close();
                  } else {
                      IMAGE_FILEPATH = uri.getPath();
                  }
              }
          } catch (Exception e) {
              Crouton.makeText(this, "Failed to get image", Style.ALERT).show();
          }
      }
      

      以及我使用的功能:

      private Uri getUri() {
          String state = Environment.getExternalStorageState();
          if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
              return MediaStore.Images.Media.INTERNAL_CONTENT_URI;
          }
      
          return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
      }
      

      这些帖子帮助了我:retrieve absolute path when select image from gallery kitkat androidGet real path from URI, Android KitKat new storage access framework

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2017-10-20
        相关资源
        最近更新 更多