Ошибка при совместном использовании сообщения и изображения с помощью неявного намерения

#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 . В этом есть две проблемы:

  1. Это очень неясно, и не все приложения будут его поддерживать
  2. Это противоречит документации для ACTION_SEND и EXTRA_STREAM , в которой говорится, что Uri у них должна быть content схема и она должна быть подкреплена ContentProvider

Самое простое решение для вас-скопировать свой ресурс в какой-либо файл в файловой системе (например, в getCacheDir() ), а затем сделать его доступным с помощью FileProvider.getUriForFile() . Этот пример Java-проекта и его аналог в Kotlin демонстрируют базовую концепцию, хотя я использую ресурс вместо рисоваемого ресурса, и я использую ACTION_VIEW вместо ACTION_SEND .