Как передать одно изображение с помощью Intent, которое использует контент URI (_not_ file uri) в Android - PullRequest
3 голосов
/ 31 января 2012

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

Мне нужно отправить изображение из одного действия (настраиваемая активность камеры), где второе действие - это загрузка изображения в Веб-альбом 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) ...

В частности: Как я могу создать 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, используемого в приложении.

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

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

1 Ответ

1 голос
/ 31 января 2012

Информация, связанная с медиа-файлами, хранится в 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(android.content.ContentResolver, android.net.Uri, java.lang.String []

...