2016-02-12 3 views
1

Я разрабатываю приложение, которое заполняет шаблон электронной почты и добавляет изображение. Я хочу использовать приложение следующим образом: из галереи, я делю изображение с моим приложением через ACTION_SEND. Мое приложение выполняет некоторую обработку, а затем делится электронной почтой с приложением.Устремление URI прямого изображения

Теперь я пытаюсь просто получить изображение Uri и передать его, но тогда я получаю SecurityException.

protected void onCreate(Bundle savedInstanceState) { 
    // Read the incoming intent 
    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 
    Uri imageUri; 

    if (Intent.ACTION_SEND.equals(action) && type != null) { 
     if (type.startsWith("image/")) { 
      imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
     } 
    } 

    // Create the outgoing intent 
    Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.setType("message/rfc822"); 
    if(imageUri != null){ 
     emailIntent.putExtra(Intent.EXTRA_STREAM, imageUri); 
    } 

    startActivity(Intent.createChooser(emailIntent, getString(R.string.chooserText))); 
} 

Logging:

02-12 14:07:11.196 10241-10241/? E/ResolverActivity: Unable to launch as uid 10156 package ***, while running in android:ui 
java.lang.SecurityException: Uid 10156 does not have permission to uri 0 @ content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F19546/FORMAT_JPEG/778368258 

Что бы правильный способ сделать это? Я попытался установить флаги и разрешения, но я не могу найти, как это сделать.

+0

Как вы добавили эти флаги и разрешения? Для какой версии API (мин и цель) вы разрабатываете? – kazbeel

ответ

1

из библиотеки изображений, я разделяю картину с моим приложением

Вы не объясните, что это значит. Я интерпретирую это как означающее, что вы добавили в приложение приложение ACTION_SEND, и что вы используете опцию «share» в приложении библиотеки изображений, чтобы отправить изображение в ваше приложение.

Что было бы правильным путем?

В какой-то мере нет правильного способа сделать это. Ваши варианты:

  1. Скопируйте изображение в приложение (например, во внутреннее хранилище), а затем разделить локальную копию (например, с помощью FileProvider)

  2. Не используйте ACTION_SEND, чтобы получить изображение. Вместо этого используйте MediaStore, чтобы найти изображения и представить свой собственный интерфейс с этими изображениями. Затем отправьте Uri для выбранного изображения через ACTION_SEND. Вероятно, это работает, хотя я не настолько уверен в себе, как и в других двух вариантах.

  3. Не используйте ACTION_SEND для отправки электронной почты, но вместо этого используйте JavaMail или некоторую эквивалентную библиотеку (требуется, чтобы пользователь дал вам много нехорошего материала, например, пароли электронной почты) или использовал ваш веб-сервер для его отправки (требуется, чтобы вы загрузите изображение на свой сервер).

  4. Не пишите это приложение, так как пользователь может отправить изображение по электронной почте самостоятельно из того же «общего» меню в приложении «Библиотека изображений», которое они используют для запуска вашего приложения.

Проблема заключается в том, что у вас есть три приложения здесь: A, B, и C:

  • А библиотеке изображений

  • B ваше приложение

  • C - клиент электронной почты, который вы пытаетесь вызвать через ACTION_SEND

Когда A использует ACTION_SEND для вызова B, A предоставляет права на B для работы с изображением. Однако B не имеет возможности развернуться и предоставить права на C для работы с изображением A.

0

Начиная с API 16, достаточно добавить FLAG_GRANT_READ_URI_PERMISSION в намерение долевого участия. Это предоставит получающему приложению разрешение на чтение content:// URI. Он также работает транзитивно, то есть разрешение было предоставлено вашему приложению, и вы можете предоставить его получающему приложению.

emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

В версиях до API 16 это не будет работать, потому что content:// URI хранится в EXTRA_STREAM и разрешения URI применяются только к URI, установленных с setData(Uri). Чтобы обойти это ограничение, вы можете добавить следующую строку.

emailIntent.setData(imageUri); 

На стороне записки: Использование «сообщение/rfc822» не будет ограничивать список к электронной почте функции выбора приложений. Нет почтового клиента, которого я знаю, имеет фильтр намерений, который специально соответствует «message/rfc822». Он работает только потому, что большинство почтовых клиентов поддерживают прикрепление произвольных файлов, то есть «*/*». Но так, например, файловых менеджеров, и поэтому они также отображаются в этом списке. Вы можете также использовать правильный тип MIME для изображения.

Смежные вопросы