Ci sono due requisiti:Come inviare e-mail con allegato utilizzando solo app di posta elettronica?
- -mail con allegato
- Nel
Intent
Scelta, ci dovrebbe essere solo Apps Email.
Quello che ho conosciuto/fatto:
Intent.ACTION_SENDTO
conintent.setData(Uri.parse("mailto:"))
può fare in modo che non ci sono solo le applicazioni di posta elettronica inIntent
di selezione, ma non porterà attacco (Per alcune applicazioni come Gmail è lo farà, ma ci sono anche molte app che ignoreranno l'allegato).Intent.ACTION_SEND
può inviare e-mail con allegato. Tuttavia, nel selettoreIntent
, ci saranno app che in realtà non sono app di posta elettronica, ma possono rispondere aIntent.ACTION_SEND
. L'utilizzo diintent.setType("message/rfc822")
può ridurre il numero di tali app ma non tutte.Riferimenti a questa risposta: https://stackoverflow.com/a/8550043/3952691 e quasi riusciti nei miei obiettivi. Il mio codice è il seguente:
private static void sendFeedbackWithAttachment(Context context, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0); if (resolveInfos.isEmpty()) { Toast.makeText(context, context.getString(R.string.error_activity_not_found), Toast.LENGTH_SHORT).show(); } else { // ACTION_SEND may be replied by some apps that are not email apps. However, // ACTION_SENDTO doesn't allow us to choose attachment. As a result, we use // an ACTION_SENDTO intent with email data to filter email apps and then send // email with attachment by ACTION_SEND. List<LabeledIntent> intents = new ArrayList<>(); Uri uri = getLatestLogUri(); for (ResolveInfo info : resolveInfos) { Intent i = new Intent(Intent.ACTION_SEND); i.setPackage(info.activityInfo.packageName); i.setClassName(info.activityInfo.packageName, info.activityInfo.name); i.putExtra(Intent.EXTRA_EMAIL, new String[] { Def.Meta.FEEDBACK_EMAIL }); i.putExtra(Intent.EXTRA_SUBJECT, subject); i.putExtra(Intent.EXTRA_STREAM, uri); intents.add(new LabeledIntent(i, info.activityInfo.packageName, info.loadLabel(context.getPackageManager()), info.icon)); } Intent chooser = Intent.createChooser(intents.remove(0), context.getString(R.string.send_feedback_to_developer)); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new LabeledIntent[intents.size()])); context.startActivity(chooser); } }
Tuttavia, su alcuni dispositivi (ad esempio, Xiaomi 2S con MIUI V5, non so se questo può essere influenzato da una ROM di terze parti), il risultato è un vuoto
Intent
chooser. E sembra che sopra Android 6.0,Intent.EXTRA_INITIAL_INTENTS
abbia alcuni bug (Custom intent-chooser - why on Android 6 does it show empty cells?, e un altro: https://code.google.com/p/android/issues/detail?id=202693).
Di conseguenza, non so come raggiungere i miei obiettivi. Per favore aiutami, grazie in anticipo.
"Intent.ACTION_SENDTO con intent.setData (Uri.parse (" mailto: ")) può assicurarsi che non ci sono solo le applicazioni di posta elettronica in Scelta Intent" -- no non lo fa. Mette nel selettore qualsiasi app che scelga di supportare quella struttura 'Intento'. Chiunque può scrivere una tale app, e potrebbe non essere una "App per email". Non esiste una dichiarazione universale su cosa siano "le app di posta elettronica". – CommonsWare
@CommonsWare Sì, lo so. Ma sto parlando di un caso comune. Possiamo dire, un'app che ha un 'IntentFilter' per' Intent.ACTION_SEND' e uno schema di dati come "mailto", se si tratta di un'app formale, dovrebbe avere la capacità di gestire gli eventi di e-mail in modo che possiamo vederlo come un " App email ". – ywwynm
@ywwynm Usa .setType ("message/rfc822") o il selettore mostrerà tutte le (molte) applicazioni che supportano l'intento di invio. – Stanojkovic