2010-02-05 11 views
11

sull'emulatore con una mail-app di default tutto funziona benissimo. Ma non ho alcun allegato quando ricevo una mail che ho inviato dal mio eroe usando un'app Gmail. L'app Mail predefinita sull'eroe funziona correttamente.Android: Intent.ACTION_SEND con EXTRA_STREAM non attribuisce alcuna immagine quando si sceglie Gmail su HTC Hero

Come posso fare questo codice funziona con Gmail app su Eroe?
Puoi vedere il codice qui sotto.

private void startSendIntent() { 
     Bitmap bitmap = Bitmap.createBitmap(editableImageView.getWidth(), editableImageView.getHeight(), Bitmap.Config.RGB_565); 
     editableImageView.draw(new Canvas(bitmap)); 
     File png = getFileStreamPath(getString(R.string.file_name)); 
     FileOutputStream out = null; 
     try { 
      out = openFileOutput(getString(R.string.file_name), MODE_WORLD_READABLE); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
      out.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (out != null) out.close(); 
      } 
      catch (IOException ignore) {} 
     } 
     final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png)); 
     emailIntent.setType("image/png"); 
     startActivity(Intent.createChooser(emailIntent, getString(R.string.send_intent_name))); 
} 

in registri compaiono i seguenti:

02-05 17:03:37.526: DEBUG/Gmail(11511): URI FOUND:file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg 
02-05 17:03:37.535: DEBUG/Gmail(11511): ComposeActivity added to message:0 attachment:|IMAG0001.jpg|image/jpeg|0|image/jpeg|LOCAL_FILE|file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg size:0 
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> Attachment uri: file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg 
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>   type: image/jpeg 
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>   name: IMAG0001.jpg 
02-05 17:03:37.585: INFO/Gmail(11511): >>>>>   size: 0 

Grazie per la risposta.

+1

Cosa build è il tuo eroe? Ho incontrato diversi problemi in cui il senso di sovrapposizione di HTC hanno rotto le funzionalità di Android, non riceve un intento OUT_GOING_CALL in alcuni casi è uno, questo può essere un altro se hai lì ultima build –

+0

devo costruire 2.73.411.17 e versione del software 1.0.0. A6288 – shinydev

risposta

31

Per me il problema è stato risolto con le seguenti righe di codice:

Bitmap screenshot = Bitmap.createBitmap(_rootView.getWidth(), _rootView.getHeight(), Bitmap.Config.RGB_565); 
_rootView.draw(new Canvas(screenshot)); 

String path = Images.Media.insertImage(getContentResolver(), screenshot, "title", null); 
Uri screenshotUri = Uri.parse(path); 

final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
emailIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri); 
emailIntent.setType("image/png"); 

startActivity(Intent.createChooser(emailIntent, "Send email using")); 

La cosa fondamentale è che sto salvando lo screen-shot alla libreria multimediale e quindi può inviare correttamente un file da Là.

+0

Sì, ho risolto il problema in questo modo. Sembra che ci siano differenze tra i permessi dei dispositivi di rilevamento HTC e le autorizzazioni dell'emulatore. – shinydev

+0

Mi aiuta too..thnks .. – Debarati

+2

@Aleks N., questo è un approccio bello (il che significa che funziona bene - ho provato). Ma la mia unica domanda è: l'immagine è archiviata da qualche parte sul telefono? O è questa memoria temporanea? – Phil

7

getFileStreamPath() o openFileOutput() creerà i file in una directory privata che è inaccessibile per altre applicazioni (cioè Gmail). Utilizzare storage esterno per creare file accessibili al pubblico:

private static final int REQUEST_SHARE = 39714; 

private File png = null; 

private void startSendIntent() { 
    png = new File(new File(Environment.getExternalStorageDirectory(), "Pictures"), getString(R.string.file_name)); 

    FileOutputStream out = null; 
    try { 
     out = new FileOutputStream(png); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
     out.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (out != null) out.close(); 
     } 
     catch (IOException ignore) {} 
     } 
     final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png)); 
     emailIntent.setType("image/png"); 
     startActivityForResult(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)), REQUEST_SHARE); 
    } 
} 

Questo non funziona quando la memorizzazione esterno non è disponibile, come quando è montato come un disco USB. Vedere lo Storage API Guide per ulteriori informazioni su come rilevare se lo spazio di archiviazione esterno è disponibile.

Se il livello API minimo è 8 o superiore, è possibile utilizzare Context.getExternalCacheDir() o Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) come directory padre.

A meno che non si usi getExternalCacheDir(), assicurarsi di utilizzare un nome file univoco per impedire che uno dei file degli utenti venga sovrascritto accidentalmente.

Infine, è possibile ignorare onActivityResult() per eliminare il file dopo l'operazione di condivisione completa:

numero
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode == REQUEST_SHARE) { 
     if(this.png == null) { 
      return; 
     } 

     this.png.delete(); 
    } 
} 
+0

Grazie mille per il suggerimento. Questo è il modo più semplice per fare il lavoro. Nel mio caso Context.getExternalCacheDir() non funziona, ma Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) funziona perfettamente. – Hong

Problemi correlati