2013-08-19 9 views
5

Próbuję wysłać wiadomość e-mail z mojej aplikacji z jej logo.
Ale otrzymuję wiadomość e-mail, gdy załącznik ma format ciąg (powinien być png).
Mój kod:
Zdjęcie z Androidem do wiadomości e-mail nie działa

Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("application/image"); 

    intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.fb_share_description)); 
    intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://my.package/" + R.drawable.ic_launcher)); 
    Intent chooser = Intent.createChooser(intent, "share"); 
    startActivity(chooser); 

Co należy zrobić?

+0

Czy możesz wyjaśnić scenariusz więcej. Nie jest to wystarczająco jasne. –

+0

Bardzo proste, plik nie jest wysyłany w formacie png. – NickF

Odpowiedz

8

Nie można dołączać plików do wiadomości e-mail z zasobów wewnętrznych. Najpierw należy skopiować go do powszechnie dostępnego obszaru pamięci, na przykład karty SD.

InputStream in = null; 
OutputStream out = null; 
try { 
    in = getResources().openRawResource(R.drawable.ic_launcher); 
    out = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "image.png")); 
    copyFile(in, out); 
    in.close(); 
    in = null; 
    out.flush(); 
    out.close(); 
    out = null; 
} catch (Exception e) { 
    Log.e("tag", e.getMessage()); 
    e.printStackTrace(); 
} 


private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int read; 
    while ((read = in.read(buffer)) != -1) { 
     out.write(buffer, 0, read); 
    } 
} 

//Send the file 
Intent emailIntent = new Intent(Intent.ACTION_SEND); 
emailIntent.setType("text/html"); 
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "File attached"); 
Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "image.png")); 
emailIntent.putExtra(Intent.EXTRA_STREAM, uri); 
startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

Jest to wymagane, ponieważ zasoby dostępne w pakiecie z aplikacją są tylko do odczytu i są przechowywane w piaskownicy. Identyfikator URI, który otrzymuje klient poczty e-mail, nie może uzyskać dostępu.

+0

Czy mogę zatrzymać plik w zasobach? – NickF

+0

+1 dobrze wyjaśnione ... @ Raghav Sood Czy możemy używać do tego dostawców treści? –

+0

@NickF Możesz przechowywać plik w dowolnym miejscu, o ile skopiujesz go do pamięci zewnętrznej przed jego podłączeniem. –

Powiązane problemy