(我读过很多类似的问题,但请耐心等待(
我需要从一个活动(自定义相机活动(发送图像,其中第二个活动是通过谷歌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上传活动(或任何其他共享应用程序(时,这非常有效。我还可以通过我正在使用的 Picasa 示例应用程序上传照片,当从画廊/相机等共享图像时。
但是我无法弄清楚如何构建使用"content://---"uri 的 Intent 并将其传递给另一个应用程序(无论是此示例应用程序还是 Picasa 标准应用程序(......
具体来说:如何创建与以下代码兼容的意图(即使用"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请求。
对内容 uri 进行硬编码有效。例如:
uploadIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://media/external/images/media/11"));
与媒体文件相关的信息由MediaStore
存储,这是一个内容提供程序(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[]