0

Я пытаюсь отправить электронное письмо с намерением явно позвонить GMAIL в мое приложение. Он отлично работал на всех устройствах, но теперь у меня произошли сбои на устройствах 6 Маршаллонов Android 6. Проблема я получаю это:Android Marshmallow, отправляющий несколько файлов в gmail с намерением

12-14 00:02:55.365: E/AndroidRuntime(18570): Theme: themes:{default=overlay:com.cyngn.hexo, iconPack:com.cyngn.hexoicons, fontPkg:com.cyngn.hexo, com.android.systemui=overlay:com.cyngn.hexo, com.android.systemui.navbar=overlay:com.cyngn.hexo} 
12-14 00:02:55.365: E/AndroidRuntime(18570): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.SEND_MULTIPLE typ=image/* flg=0x3 cmp=com.google.android.gm/.ComposeActivityGmail clip={image/* U:file:///storage/emulated/0/Mydir/myfile20161213105548.jpg} (has extras) } from ProcessRecord{cc9833c 18570:com.myappdr/u0a341} (pid=18570, uid=10341) not exported from uid 10050 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.os.Parcel.readException(Parcel.java:1620) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.os.Parcel.readException(Parcel.java:1573) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2677) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1509) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.Activity.startActivityForResult(Activity.java:3930) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.Activity.startActivityForResult(Activity.java:3890) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.Activity.startActivity(Activity.java:4213) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.Activity.startActivity(Activity.java:4181) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at com.myapp.SendGmail.onClick(SendGmail.java:222) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.os.Handler.dispatchMessage(Handler.java:102) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.os.Looper.loop(Looper.java:148) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at android.app.ActivityThread.main(ActivityThread.java:5461) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at java.lang.reflect.Method.invoke(Native Method) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
12-14 00:02:55.365: E/AndroidRuntime(18570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Вот разрешение у меня есть в моем манифесте:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

А вот как я отправляю почту в моем источнике:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getResources().getString(R.string.mail_title)); 
emailIntent.setType("image/*"); 

ArrayList<Uri> uris = new ArrayList<Uri>(); 

for (Map.Entry<CartElement,Integer> c : SingletonShoppingCart.getInstance(null).get_Cart().entrySet()){ 
    if ((c.getKey().getImgPath() !=null) || (!c.getKey().getImgPath().isEmpty())){ 
     uris.add(Uri.fromFile(new File(c.getKey().getImgPath()))); 
    } 
} 

emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,strMailMsg); 
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); 
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
startActivity(emailIntent); 
+0

Измените свой вопрос и опубликуйте всю трассировку стека Java. – CommonsWare

+0

Вместо этого используйте ACTION_SEND. – greenapps

+0

Я добавил всю трассировку стека. В настоящее время я могу воспроизвести его на моем телефоне OnePlusOne, который использует CianogenMod, но сбои в консоли разработчика из Marshmallow. –

ответ

0

FLAG_GRANT_READ_URI_PERMISSION не работает с URI файлов, например, сгенерированными с Uri.fromFile(). Вы должны использовать контент: // URI, например, от FileProvider.

+0

Я пробовал, но он не работает, если я придерживаюсь только вызова приложения gmail. –

0

У вас есть это:

emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail"); 

Удалить это, потому что это не экспортируемый деятельность. Эта активность доступна для Gmail для начала, но не для сторонних разработчиков.

Кроме того, share where the user wants. Не все пользователи Android используют Gmail.

Долгосрочный, вам также потребуется обратиться к Ian Lake's concern, так как ваш код не будет работать на устройствах Android 7.0+, как только вы поднимете targetSdkVersion до 24 или выше.

+0

Что делать, если я хочу, чтобы пользователи явно использовали приложение Gmail? –