如何使用在Android中使用内容uri(_not_ file uri)的Intent传递单个图像

时间:2012-01-31 03:26:57

标签: android google-api picasa

(我已经阅读了很多类似的问题,但请耐心等待我)

我需要从一个活动(自定义相机活动)发送图像,其中第二个活动是通过Google API将图像上传到Picasa网络相册。

我发现的每个例子都是这样的:

File f = new File(cacheDir, "image_name.jpg");
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("image/jpeg"); 
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); 
startActivity(intent);

当我使用标准的Android Picasa上传活动(或任何其他共享应用)时,此功能完全正常。我还可以通过我正在使用的the Picasa example应用上传照片,当共享图库/相机等图像时

但我无法弄清楚如何构建一个使用" content:// ---" uri并将其传递给另一个应用程序(对于此示例应用程序或Picasa标准应用程序).​​..

具体来说:我如何创建一个与下面的代码兼容的Intent(即使用" content://" uri而不是" file://" uri) ?

  static class SendData {
    String fileName;
    Uri uri;
    String contentType;
    long contentLength;

    SendData(Intent intent, ContentResolver contentResolver) {
    Bundle extras = intent.getExtras();
    if (extras.containsKey(Intent.EXTRA_STREAM)) {
        Uri uri = this.uri = (Uri) extras.get(Intent.EXTRA_STREAM);
        String scheme = uri.getScheme();

        if (scheme.equals("content"))  {
            Cursor cursor = contentResolver.query(uri, null, null, null, null);
            cursor.moveToFirst();
            this.fileName = cursor.getString(cursor.getColumnIndexOrThrow(Images.Media.DISPLAY_NAME));
            this.contentType = intent.getType();
            this.contentLength = cursor.getLong(cursor.getColumnIndexOrThrow(Images.Media.SIZE));
        }   
      }
    }
  }
  • 从文件中检索文件信息uri手动导致NullPointerException,并在应用程序中使用Google Http Request。

硬编码内容uri有效。 E.g:

 uploadIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://media/external/images/media/11"));

1 个答案:

答案 0 :(得分:1)

与媒体文件相关的信息由MediaStore存储,这是一个ContentProvider(http://developer.android.com/reference/android/provider/MediaStore.Images.html)

MediaStore.Images.DATA列对应于文件路径,MediaStore.Images._ID列对应于ID。

您需要查询与您的文件路径对应的ID,然后从中创建一个ContentUri(如果图像在外部存储上,将是MediaStore.Images.Media.EXTERNAL_CONTENT_URI + id,我会尝试想一个将ID转换为内容Uri的更好方法。

http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html#query(android.content.ContentResolver, android.net.Uri, java.lang.String[]