Как передать одно изображение с намерением, которое использует содержимое uri (_not_ file uri) в Android

(Я читал много подобных вопросов, но терпите меня здесь)

Мне нужно отправить изображение из одного действия (настраиваемая камера), где второе действие — загрузить изображение в веб-альбом Picasa через Google API.

Каждый пример, который я нашел, выглядит примерно так:

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, которое я использую, когда делюсь изображением из галереи/камеры и т. д.

Но я не могу понять, как создать Intent, который использует uri "content://---" и передать его другому приложению (ни для этого примера приложения, ни для стандартного приложения 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, используемым в приложении.

Жесткое кодирование Content uri работает. Например:

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

person kjartan    schedule 31.01.2012    source источник
comment
Итак, для файла вам нужен Content URI. Это то, что вы спрашиваете?   -  person Vikram Bodicherla    schedule 31.01.2012
comment
Да, это примерно так..   -  person kjartan    schedule 31.01.2012


Ответы (1)


Информация, связанная с файлами мультимедиа, хранится в MediaStore, который является ContentProvider (http://developer.android.com/reference/android/provider/MediaStore.Images.html).

Столбец MediaStore.Images.DATA соответствует пути к файлу, а столбец MediaStore.Images._ID соответствует идентификатору.

Вам нужно запросить идентификатор, соответствующий вашему пути к файлу, а затем создать из него ContentUri (который будет MediaStore.Images.Media.EXTERNAL_CONTENT_URI + id, если изображение находится на внешнем хранилище, я попытаюсь придумать лучший способ перевести идентификатор в Content Uri).

http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html#query%28android.content.ContentResolver,%20android.net.Uri,%20java.lang.String%5B%5D%29

person Vikram Bodicherla    schedule 31.01.2012
comment
Да, это работает нормально. Спасибо. Нашел связанный вопрос здесь stackoverflow.com/a/7945572/1179106: пример кода, который находит идентификатор заданного изображения имя, провайдер и контекст приложения. - person kjartan; 01.02.2012