2016-05-12 25 views
9

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 con intent.setData(Uri.parse("mailto:")) può fare in modo che non ci sono solo le applicazioni di posta elettronica in Intent 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 selettore Intent, ci saranno app che in realtà non sono app di posta elettronica, ma possono rispondere a Intent.ACTION_SEND. L'utilizzo di intent.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.

+0

"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

+0

@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

+0

@ywwynm Usa .setType ("message/rfc822") o il selettore mostrerà tutte le (molte) applicazioni che supportano l'intento di invio. – Stanojkovic

risposta

-1

Prova questo più efficiente:

String[] TO = {"[email protected]"}; 
    Uri uri = Uri.parse("mailto:[email protected]") 
      .buildUpon() 
      .appendQueryParameter("subject", "subject") 
      .appendQueryParameter("body", "body") 
      .build(); 
    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri); 
    emailIntent.putExtra(Intent.EXTRA_EMAIL, TO); 
    startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
+0

Hai provato tu stesso? Ci saranno più app che E-mail mostrate nel selettore. E il tuo tipo di intento è "plain/text"? – ywwynm

+0

ho codice aggiornato puoi provare. \ n Per inviare file Uri uri = Uri.fromFile (nuovo file (imagePath)); emailIntent.putExtra (Intent.EXTRA_STREAM, uri); – Gmaster

+0

@ywwynm funziona o no? – Gmaster

-2

Ci sono due modi per fare questo

OPZIONE 1

Intent emailIntent = new Intent(
      android.content.Intent.ACTION_VIEW); 


    //Option 1 
    Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" 
      + "&body=" + "blah blah body" + "&to=" + "[email protected]"); 
    emailIntent.setData(data); 

    startActivity(Intent.createChooser(emailIntent, "")); 

Risultato

enter image description here

OPZIONE 2

Funziona perfactly eccezione è solito filtrare FTP

//Option 2 
    emailIntent = new Intent(
      android.content.Intent.ACTION_SEND); 
    emailIntent.setType("message/rfc822"); 
    final String[] toRecipients = new String[] { "[email protected]", "", }; 
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, toRecipients); 
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "blah blah subject"); 
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, 
      Html.fromHtml("blah blah body")); 

    startActivity(Intent.createChooser(emailIntent, "")); 

Risultato

enter image description here

Entrambi i metodi hanno difetti minori vi mostro in entrambe le direzioni si è ora fino a sceglierne uno

+0

Gesù !!! Potresti vedere la mia domanda con attenzione? Nella sezione 1: "Ci sono due requisiti", ho pubblicato ciò di cui ho bisogno in modo molto chiaro. Quindi controlliamo la risposta: per l'opzione 1, dov'è l'allegato? E l'opzione 2, ho visto qualcosa come ADM Browser e LAN? Sono e-mail app? Dio mio!!! – ywwynm

0

provare il codice qui sotto per inviare una mail

String filename="filename.vcf"; 
File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename); 
Uri path = Uri.fromFile(filelocation); 
Intent emailIntent = new Intent(Intent.ACTION_SEND); 
// set the type to 'email' 
emailIntent .setType("vnd.android.cursor.dir/email"); 
String to[] = {"[email protected]"}; 
emailIntent .putExtra(Intent.EXTRA_EMAIL, to); 
// the attachment 
emailIntent .putExtra(Intent.EXTRA_STREAM, path); 
// the mail subject 
emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject"); 
startActivity(Intent.createChooser(emailIntent , "Send email...")); 
+0

Che dire di ** messaggio/rfc822 **, ha impostato il tipo di email? –