2013-08-29 24 views
7

Łączę udział z poniższym kodem aplikacji.Udostępnianie obrazu png w folderze do rysowania

private void socialShare() 
    { 
     Uri uri = Uri.parse("android.resource://com.example.myproject/drawable/appicon"); 
     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
     shareIntent.putExtra(Intent.EXTRA_TEXT, "sharing myapp"); 
     shareIntent.setType("image/jpeg"); 
     startActivity(Intent.createChooser(shareIntent, "Share from")); 
    } 

jak w powyższym kodzie, staram się umieścić png image który jest w rozciągliwej folderu. Ale obraz nie może zostać wysłany. Czy to dlatego, że w setType jest to image/jpeg? Nie mogę używać jpeg, ponieważ traci przejrzystość. Czy ktoś może mi zaproponować, jak podzielić się z obrazem?

Oto kod, który używam, aby skopiować obraz z rozciągliwej do sdcard:

String commonPath = Environment.getExternalStorageDirectory().toString() + "/MyAppFolder"; 
     File direct = new File(commonPath); 

     if(!direct.exists()) 
     { 
      if(direct.mkdir()) 
       { 
       Log.d("tag","directory created"); 
       //directory is created; 
       } 

     } 

     Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.sharingimage); 
     OutputStream outStream = null; 
      File savingFile = new File(commonPath, "shareImage.png"); 
      if(!savingFile.exists()) 
      { 
       Log.d("tag","file is created"); 

      try { 
       savingFile.createNewFile(); 
       outStream = new FileOutputStream(savingFile); 
       bm.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
       outStream.flush(); 
       outStream.close(); 

       Log.d("tag","Saved"); 

       } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

       } 

      } 

Odpowiedz

1

Nie można bezpośrednio udostępnić uri od Ciebie aplikacje pamięci wewnętrznej (oczywiście resourses z aplikacji będzie zawsze w pamięci wewnętrznej)

istnieją dwa sposoby osiągnięcia tego celu ..

  1. skopiować obraz do pamięci zewnętrznej, a następnie udostępnić go stamtąd . Zobacz this

  2. Napisz dostawcę treści, aby udostępnić zdjęcie. Do tego odnosi Create and Share a File from Internal Storage

+0

Dzięki za odpowiedź. Ale nie jestem w stanie zrobić tego w pierwszy sposób. – rick

+0

czy skopiowałeś obraz do pamięci zewnętrznej? –

+0

Nie. Nie mogę skopiować obrazu. Zawsze zgłasza wyjątek nie znalezionego pliku. Czy możesz pokazać mi fragment kodu, jeśli już go masz? – rick

10

można udostępniać za pomocą następującej metody ...

Intent shareIntent = new Intent(); 
shareIntent.setAction(Intent.ACTION_SEND); 
shareIntent.setType("image/png"); 
Uri uri = Uri.parse("android.resource://your package name/"+R.drawable.ic_launcher); 
shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
shareIntent.putExtra(Intent.EXTRA_TEXT, "Hello, This is test Sharing"); 
startActivity(Intent.createChooser(shareIntent, "Send your image")); 

Sprawdzony ... działa na mnie

+0

Nie, to nie działa. Mówi, że nie można dołączyć do wszystkich przedmiotów. Przetestowałem pod kątem fb, google +, gmail, aplikacji do obsługi wiadomości. Nic nie działało. – rick

+0

próbowałem, nie działa –

+0

nie działa dla mnie albo – jonney

12

znalazłem rozwiązanie, w którym nie należy skopiować obraz na karcie SD. Oto ona:

try { 
     Uri imageUri = null; 
     try { 
      imageUri = Uri.parse(MediaStore.Images.Media.insertImage(this.getContentResolver(), 
        BitmapFactory.decodeResource(getResources(), R.drawable.fragment_menu_logo), null, null)); 
     } catch (NullPointerException e) { 
     } 
     String text = getString(R.string.share_text); 
     // Launch the Google+ share dialog with attribution to your app. 
     Intent shareIntent = new PlusShare.Builder(mActivity) 
       .setType("image/*") 
       .setText(text) 
       .addStream(imageUri) 
       .getIntent(); 
     startActivity(shareIntent); 
    } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(mActivity, mActivity.getString(R.string.share_google_plus_not_installed), Toast.LENGTH_LONG).show(); 
    } 
+0

To działa na poprzednie rozwiązanie, dzięki! –

+1

@RSenApps Zapomniałem dodać łowienie NullPointerException (tutaj http://stackoverflow.com/questions/12230942/why-images-media-insertimage-return-null wyjaśnia, kiedy jest to możliwe). Zobacz zaktualizowaną odpowiedź. –

+0

To sprawia, że ​​losowanie traci swoją przejrzystość, czy i tak znalazłeś? –

7
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.xxxx); 
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/LatestShare.jpg"; 
OutputStream out = null; 
File file=new File(path); 
try { 
    out = new FileOutputStream(file); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    out.flush(); 
    out.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
path=file.getPath(); 
Uri bmpUri = Uri.parse("file://"+path); 
Intent shareIntent = new Intent(); 
shareIntent = new Intent(android.content.Intent.ACTION_SEND); 
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri); 
shareIntent.setType("image/jpg"); 
startActivity(Intent.createChooser(shareIntent,"Share with")); 

To działa na mnie idealnie, a to będzie potrzebne pozwolenie zapisu

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Dodaj tę linię do Android manifest o pozwolenie zapisu.

+0

Działa jak urok. Dzięki człowieku, uratowałeś mój dzień :) – Ale

+0

Awesome .... !!! tak prosta i słodka odpowiedź .. !!! – Nils

3

pierwsze pozwolenie add

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

użycie bitmapy z OZE

Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage); 
      Intent share = new Intent(Intent.ACTION_SEND); 
      share.setType("image/jpeg"); 
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      b.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
      String path = MediaStore.Images.Media.insertImage(getContentResolver(), 
        b, "Title", null); 
      Uri imageUri = Uri.parse(path); 
      share.putExtra(Intent.EXTRA_STREAM, imageUri); 
      startActivity(Intent.createChooser(share, "Select")); 

Testowany przez bluetooth.

Działa jak urok.