Отправка данных с несколькими вложениями с целью электронной почты - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть действие FeedbackActivity.java, которое принимает ответ от пользователя с несколькими вложениями (до 3 изображений в качестве вложений).

Я использую следующий код:

Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);     
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_EMAIL, emails);                   //emails is an Array of 'String' type
intent.putExtra(Intent.EXTRA_SUBJECT, subject);                //subject is a String
intent.putExtra(Intent.EXTRA_TEXT, text)                       //text is a String
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); //uris is an ArrayList of 'Uri' type
                                                              //uris stores all Uri of images selected

if(intent.resolveActivity(getPackageManager()) != null){
    startActivity(intent);
}
else {
    Toast.makeText(this, "Not Good", Toast.LENGTH_SHORT).show();
}

Теперь этот код работает нормально, но проблема в том, что он показывает все виды приложений, которые поддерживают MIME-тип "message / rfc822".

Изображение показано ниже:

enter image description here

Мне нужно только показать приложения почтового клиента, я пробовал Uri.parse ("mailto:"), но не тренировался, и код всегда перемещается в оператор else и показывает тост "не хорошо".

Я прочитал документацию Google, но она показывает только простые случаи. Я пытался искать в Интернете. Многие разработчики используют intent.setType("*/*") или intent.setType("text/plain"). Но они также показывают приложения, отличные от почтовых клиентов.

Пожалуйста, ведите меня.

И я хотел бы спросить в целом:

Документация Google показывает простые примеры, которые хороши в некотором смысле, но как по-настоящему углубленно изучить такие темы?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Итак, здесь мы будем использовать два намерения: selectorIntent и emailIntent. selectorIntent - это то, что emailIntent будет использовать для отображения доступных приложений. код:

Intent selectorIntent = new Intent(Intent.ACTION_SENDTO);
selectorIntent.setData(Uri.parse("mailto:"));

final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, emails);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
emailIntent.setSelector(selectorIntent);
if(emailIntent.resolveActivity(getPackageManager()) != null){
    startActivity(emailIntent);
}
else {
    Snackbar.make(scrollView, "Sorry, We couldn't find any email client apps!", Snackbar.LENGTH_SHORT).show();
}

Теперь он будет выбирать только приложения, являющиеся почтовым клиентом.

Если в вашем телефоне только одно почтовое клиентское приложение, оно откроется непосредственно. И если такого приложения нет, код покажет Snackbar, указанный в другой части.

0 голосов
/ 24 апреля 2020

Не используйте Uri.parse, используйте Uri.fromParts

Сделайте это так:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto","example@mail.com", null));
...