Как показать изображение посредством намерения, совместимого с различными приложениями
Я пытаюсь передать изображение, которое я ранее сохранил на диске, отправив Intent.ACTION_SEND
. Проблема в том, что я не могу найти способ быть совместимым с различными приложениями, официальным приложением Gmail и TweetDeck в моем случае.
Изображение, которое я хочу предоставить, содержится в File
:
File agendaFile;
// its path using getAbsolutePath() -> /data/data/com.mypackage/files/agenda.jpg
Вариант A) с использованием Uri.fromFile
Uri agendaUri = Uri.fromFile(agendaFile);
// the value -> file:///data/data/com.mypackage/files/agenda.jpg
Результаты
- Gmail, изображение, прикрепленное к письму? НЕТ
- Tweetdeck, изображение добавлено в сообщение твита? Да
Вариант B) с использованием Uri.parse
Uri agendaUri = Uri.parse(agendaFile.toURI().toString());
// the value -> file:/data/data/com.mypackage/files/agenda.jpg
Результаты
- Gmail, изображение, прикрепленное к письму? Да
- Tweetdeck, изображение добавлено в сообщение твита? НЕТ
Наконец
В обоих случаях я отправляю намерение следующим образом:
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpg");
intent.putExtra(android.content.Intent.EXTRA_STREAM, agendaUri);
startActivity(Intent.createChooser(intent, "title"));
Итак, есть ли другие варианты совместного использования изображения? Как лучше всего использовать изображение, совместимое с большинством приложений?
Спасибо!
Ответы
Ответ 1
Наконец-то я решил проблему хранения изображения в MediaStore. Вместо использования URI файла, что я делаю:
String agendaFilename = agendaFile.getAbsolutePath();
final ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, agendaFilename);
final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
И, наконец, я использую contentUriFile
:
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpg");
intent.putExtra(android.content.Intent.EXTRA_STREAM, contentUriFile);
startActivity(Intent.createChooser(intent, "title"));
Ответ 2
попробуйте
intent.setType("image/*");
для меня это работает для twitter, whatsapp, bluetooth....
EDIT: полный код:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
intent.putExtra(android.content.Intent.EXTRA_TEXT, R.string.visita);
Uri uri = Uri
.parse("android.resource://com.package.xname/drawable/"
+ i);
intent.putExtra(Intent.EXTRA_STREAM, uri);
Ответ 3
этот код проще
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(intent.EXTRA_EMAIL,"[email protected]");
intent.putExtra(intent.EXTRA_SUBJECT, "XXXXX");
intent.putExtra(Intent.EXTRA_TEXT, "XXXXX");
intent.setType("message/rfc822");
chosser = Intent.createChooser(intent, "Enviar Email");
intent.putExtra(intent.EXTRA_STREAM, uri);
startActivity(chosser);
Ответ 4
Для меня используется FileProvider. Я настроил его для съемки фотографий со встроенной камерой и использовал его для обмена (см. Ниже).
final Uri uri = FileProvider.getUriForFile(mActivity, "com.paeuba.paragonik.fileprovider", photoFile);
Intent intent = ShareCompat.IntentBuilder.from(mActivity).setType("image/jpeg").setStream(uri).createChooserIntent();
mActivity.startActivity(intent);