2013-08-29 10 views
7

Ich integriere mit dem folgenden Code für die App share.Gemeinsame Nutzung eines PNG-Bildes im Zeichenordner

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

Wie in dem obigen Code, ich versuche png image, die in ziehbar Ordnern zu setzen. Das Bild kann jedoch nicht gesendet werden. Ist das, weil in setType, image/jpeg? Ich kann JPEG nicht verwenden, weil es die Transparenz verliert. Kann mir jemand bitte vorschlagen, wie man mit Bild teilt?

Hier ist der Code, den ich verwende das Bild von ziehbar zu sdcard kopieren:

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

       } 

      } 

Antwort

1

Sie nicht direkt eine uri von Ihnen internen Speicher apps gemeinsam nutzen können (natürlich die resourses Ihrer App wird immer in dem internen Speicher)

es gibt zwei Möglichkeiten, dies zu erreichen ..

  1. Kopieren sie Ihr Bild auf externe Speicher es dann von dort aus gemeinsam nutzen . Siehe this

  2. Schreiben Sie einen Inhaltsanbieter, um das Bild zu teilen. Dazu verweisen Create and Share a File from Internal Storage

+0

Danke für Ihre Antwort. Aber ich kann es nicht mit dem ersten Weg schaffen. – rick

+0

haben Sie das Bild in den externen Speicher kopiert –

+0

Nein. Ich kann das Bild nicht kopieren. Es löst immer die Ausnahme "Datei nicht gefunden" aus. Können Sie mir bitte Code-Schnipsel zeigen, wenn Sie es bereits haben? – rick

10

Sie teilen können Sie die folgende Methode verwenden ...

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

Bewährt ... für mich arbeiten

+0

Nein, es funktioniert nicht. Es besagt, dass alle Elemente nicht angehängt werden können. Ich habe für fb, Google +, Google Mail, Messaging-App getestet. Nichts hat geklappt. – rick

+0

Ich habe versucht, es funktioniert nicht –

+0

funktioniert nicht für mich entweder – jonney

12

I-Lösung gefunden, wo ich nicht Bild kopieren sollte auf SD-Karte. Hier ist sie:

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

Dies funktioniert über die vorherige Lösung, danke! –

+1

@RSenApps Ich habe vergessen, fangende NullPointerException hinzuzufügen (http://stackoverflow.com/questions/12230942/why-images-media-insertimage-return-null erklärt, wann es möglich ist). Siehe aktualisiert die Antwort. –

+0

Dadurch verliert das Zeichen seine Transparenz, haben Sie es trotzdem gefunden? –

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

Dies funktioniert für mich perfekt, und diese müssen Schreibberechtigung

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

diese Zeile hinzufügen Manifest für die Schreibberechtigung für Android.

+0

Funktioniert wie ein Charme. Danke Mann, du hast meinen Tag gerettet :) – Ale

+0

Awesome .... !!! so einfach und süße Antwort .. !!! – Nils

3

Erste Add Erlaubnis

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

Verwendung Bitmap aus res

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

über Bluetooth getestet.

Funktioniert wie ein Charme.