Отправить несколько вложений (изображений и PDF-файлов) в Gmail через намерение - PullRequest
0 голосов
/ 01 августа 2020

У меня есть средство выбора файлов, которое предоставляет мне URI выбранных файлов (может быть несколько или один), теперь я хочу отправить эти выбранные файлы (изображения и PDF-файлы) в приложение Gmail с использованием намерения. Я пробовал все, что доступно в сети, для намеренной отправки вложений, но безуспешно. Пожалуйста, помогите мне разобраться в этой штуке, застрял здесь несколько дней. URI, возвращенный в HashMap: uriMap

Gmail Intent

Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO);
            emailSelectorIntent.setData(Uri.parse("mailto:"));
            Log.d("mailList", Arrays.toString(subarray));

            final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
            emailIntent.putExtra(Intent.EXTRA_EMAIL, subarray);
            emailIntent.putExtra(Intent.EXTRA_SUBJECT,(CharSequence) eventName.getText().toString());
            ArrayList<String> bodyList = new ArrayList<>();
            String body = eventDesc.getText().toString() + " at " + eventVenue.getText().toString() + ", " + hourSelect + ":" + minuteSelect;
            bodyList.add(body);

            emailIntent.putExtra(Intent.EXTRA_TEXT, bodyList);
            emailIntent.setSelector(emailSelectorIntent);
            emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            ArrayList<Uri> uris = new ArrayList<Uri>();
            Iterator iterator = uriMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry mapElement = (Map.Entry) iterator.next();
                uris.add((Uri) mapElement.getValue());
            }
            if (uris.size() != 0)
                emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

            startActivity(Intent.createChooser(emailIntent, "Choose an email application..."));

OnActivityResult code

, если выбрано несколько файлов

for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                            
Uri uri = data.getClipData().getItemAt(i).getUri();}

иначе, если один файл выбран

Uri uri;
uri = data.getData();

Ошибка LogCat

2020-08-01 16:56:16.414 30575-30575/? E/Gmail: ComposeActivity:Error adding attachment
gon: SecurityException when openAssetFileDescriptor.
    at goo.a(PG:5)
    at goo.a(PG:45)
    at dvt.a(PG:137)
    at duz.run(PG:2)
    at dvt.a(PG:176)
    at dvt.a(PG:144)
    at dvt.a(PG:443)
    at drq.a(Unknown Source:24)
    at bbkz.a(Unknown Source:19)
    at bdvu.a(Unknown Source:2)
    at bdvw.run(PG:9)
    at bdzb.run(Unknown Source:7)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
    at bbja.run(PG:2)
    at aqsr.run(Unknown Source:18)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7397)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

Помощь приветствуется.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 августа 2020

Код для выбора файла:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("*/*");
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
                startActivityForResult(Intent.createChooser(intent, "ChooseFile"), PICKFILE_RESULT_CODE);

Код для намерения:

Intent intent = new Intent();
            intent.setAction(Intent.ACTION_SEND_MULTIPLE);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra(Intent.EXTRA_EMAIL, subarray);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setType("vnd.android.cursor.dir/email");
            ArrayList<Uri> uris=new ArrayList<Uri>();
            if (uriMap.size()!=0) {
                Iterator i= uriMap.entrySet().iterator();
                while(i.hasNext()){
                    Map.Entry mapElement = (Map.Entry) i.next();
                    uris.add((Uri)mapElement.getValue());
                }
                intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
            }
            intent.setPackage("com.google.android.gm");
            startActivityForResult(intent, 101);

с использованием intent.setType() и intent.setPackage() у меня сработало!

...