#java #android #android-studio
Вопрос:
Я хочу иметь возможность поделиться сообщением и изображением в одном намерении. Сейчас это частично работает. Например, когда я делюсь им в Google keep, я могу получить заголовок, текстовое тело и изображение с помощью намерения. Однако, когда я пытаюсь отправить его по электронной почте или через какое-либо другое приложение для обмена сообщениями, я не могу отправить сообщение, прикрепляются только текст и заголовок. Я получу сообщение об ошибке: не удалось прикрепить файл.
public void characterShare(String background, String header){
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
Uri imageUri = Uri.parse("android.resource://" getPackageName()
"/drawable/" name.toLowerCase());
Intent togetherIntent = new Intent();
togetherIntent.setAction(Intent.ACTION_SEND);
togetherIntent.putExtra(Intent.EXTRA_SUBJECT,header); // subject
togetherIntent.putExtra(Intent.EXTRA_STREAM,imageUri); // image
togetherIntent.putExtra(Intent.EXTRA_TEXT, background); // body of the message
togetherIntent.setType("image/jpeg");
togetherIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(togetherIntent, "send"));
}
Ответ №1:
Я хочу иметь возможность поделиться сообщением и изображением в одном намерении
ACTION_SEND
документируется для поддержки одного EXTRA_STREAM
или EXTRA_TEXT
Intent
нескольких , а не обоих. Некоторые приложения, отвечающие на ACTION_SEND
запросы, будут учитывать и то, и другое, но не все.
Однако, когда я пытаюсь отправить его по электронной почте или через какое-либо другое приложение для обмена сообщениями, я не могу отправить сообщение, прикрепляются только текст и заголовок. Я получу сообщение об ошибке: не удалось прикрепить файл.
Вы используете an android.resource
Uri
. В этом есть две проблемы:
- Это очень неясно, и не все приложения будут его поддерживать
- Это противоречит документации для
ACTION_SEND
иEXTRA_STREAM
, в которой говорится, чтоUri
у них должна бытьcontent
схема и она должна быть подкрепленаContentProvider
Самое простое решение для вас-скопировать свой ресурс в какой-либо файл в файловой системе (например, в getCacheDir()
), а затем сделать его доступным с помощью FileProvider.getUriForFile()
. Этот пример Java-проекта и его аналог в Kotlin демонстрируют базовую концепцию, хотя я использую ресурс вместо рисоваемого ресурса, и я использую ACTION_VIEW
вместо ACTION_SEND
.