2010-02-05 10 views
11

W Emulatorze z domyślną aplikacją pocztową wszystko działa poprawnie. Ale nie mam przywiązania, gdy otrzymuję wiadomość e-mail, którą wysłałem z mojego bohatera za pomocą aplikacji Gmail. Domyślna aplikacja Mail na bohaterze działa dobrze.Android: Intent.ACTION_SEND z EXTRA_STREAM nie dołącza żadnego obrazu podczas wybierania aplikacji Gmail na htc Hero

Jak ustawić ten kod w aplikacji Gmail na Hero?
Możesz zobaczyć poniższy kod.

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))); 
} 

w logach widzę następujące:

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 

Dziękuję za odpowiedź.

+1

Co build jest na Hero? Natknąłem się na kilka problemów, w których nakładka zmysłowa HTC złamała funkcjonalność Androida, nie otrzymując intencji OUT_GOING_CALL w niektórych przypadkach jest jedna, to może być inna, jeśli masz tam najnowszą kompilację –

+0

Mam kompilację 2.73.411.17 i wersję oprogramowania 1.0.0. A6288 – shinydev

Odpowiedz

31

Dla mnie problem został rozwiązany z następujących linii kodu:

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")); 

Kluczową rzeczą jest to, że jestem zapisywania screen-shot do biblioteki multimediów, a następnie można z powodzeniem przesłać plik z tam.

+0

Tak, rozwiązałem ten problem w ten sposób. Wygląda na to, że istnieją różnice między uprawnieniami urządzeń HTC i uprawnieniami emulatora. – shinydev

+0

Pomaga mi też .. pomóżcie .. – Debarati

+2

@Aleks N., to jest miłe podejście (co oznacza, że ​​działa dobrze - wypróbowałem to). Ale moim jedynym pytaniem jest - czy obraz jest przechowywany gdzieś w telefonie? A może to tymczasowe miejsce do przechowywania? – Phil

7

getFileStreamPath() lub openFileOutput() stworzy pliki w katalogu prywatnym, który jest niedostępny dla innych aplikacji (tj Gmail). Użyj zewnętrznej pamięci masowej do tworzenia publicznie dostępnych plików:

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); 
    } 
} 

To nie zadziała, gdy pamięć zewnętrzna jest niedostępny, jak wtedy, gdy jest on zamontowany jako dysk USB. Więcej informacji o wykrywaniu, czy dostępna jest pamięć zewnętrzna, zawiera numer Storage API Guide.

Jeśli twój minimalny poziom API wynosi 8 lub więcej, możesz użyć Context.getExternalCacheDir() lub Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) jako katalogu nadrzędnego.

Jeśli nie używasz getExternalCacheDir(), upewnij się, że używasz unikatowej nazwy pliku, aby zapobiec przypadkowemu nadpisaniu jednego z plików użytkowników.

Wreszcie, można zastąpić onActivityResult() usunąć plik po operacji akcja kończy:

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

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

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

Wielkie dzięki za cynk. To najprostszy sposób na wykonanie tej pracy. W moim przypadku Context.getExternalCacheDir() nie działa, ale Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) działa idealnie. – Hong