我当时在运行ICS并使用相同Google帐户的平板电脑和手机上测试了我们的应用程序。如果我在其中一张照相,它将显示在另一台设备上(通过Picasa同步)。奇怪的是,当我执行正常操作时,照片会同时在两个设备上显示

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);

让用户从图库中选择图像。我的onActivityResult()看起来像这样:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != Activity.RESULT_OK) {
        return; // user cancelled
    }

    Uri imageUri = data.getData();
    if (imageUri == null) {
        // (code to show error message goes here)
        return;
    }

    // Get image path from media store
    String[] filePathColumn = { android.provider.MediaStore.MediaColumns.DATA };
    Cursor cursor = this.getContentResolver().query(imageUri, filePathColumn, null, null, null);

    if(cursor == null || !cursor.moveToFirst()) {
        // (code to show error message goes here)
        return;
    }

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

    if (imagePath == null) {
        // error happens here
    }
}

一切都很好,直到imagePath为null为止。该代码适用于设备上的其他照片,但不适用于同步的照片。在添加了一些日志代码之后,看起来有些生产中的用户正在发生这种情况,尽管这种情况很少发生(少于10,000张照片中的1张)。

我了解ACTION_GET_CONTENT具有EXTRA_LOCAL_ONLY标志以仅显示本地文件,但这仅在API版本11及更高版本中可用。 ACTION_GET_CONTENT还具有CATEGORY_OPENABLE,仅显示可以打开的数据。我的ACTION_PICK意图是否以某种方式(错误地?)显示了实际上不在本地或不可打开的照片?根据文档,仅假定使用INTERNAL_CONTENT_URI显示内部存储的照片。

还是我的onActivityResult()代码有任何问题?我看到了很多不同的变化:
  • 检查以确保data.getData()。getPath()不为空
  • 使用MediaStore.Images.Media.DATA而不是MediaStore.MediaColumns.DATA作为投影的
  • 使用MediaStore.Images.ImageColumns.DATA作为投影而不是MediaStore.MediaColumns.DATA 的
  • 使用managedQuery()来获取游标而不是getContentResolver()。query()
  • 使用CursorLoader来获取光标(API 11+)的

  • 使用getColumnIndexOrThrow()而不是getColumnIndex()
  • 调用cursor.getColumnIndex(MediaStore.Images.Media.DATA),然后调用cursor.moveToFirst()
  • 使用“userImage”作为列名(getColumnIndex()的参数)

  • 这些更改中的任何一项都能解决问题吗?

    最佳答案

    我有similar problem described here

    我通过使用ContentResolver直接从Intent URI中打开InputStream来解决此问题:

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) {
        final InputStream ist = context.getContentResolver().openInputStream(intent.getData());
        final Bitmap bitmap = BitmapFactory.decodeStream(ist);
        ist.close();
      }
    }
    

    关于android-intent - 带有MediaStore.Images.Media.INTERNAL_CONTENT_URI的ACTION_PICK,允许用户选择通过picasa同步的图像(不在设备上?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12078870/

    10-11 02:57