2017-05-23 7 views
0

Ich muss Bild teilen und "Bild speichern" Element in Android-Share-Menü hinzufügen, sah ich so etwas in 9gag app, sie haben "Speichern" -Eintrag im Aktienmenü, und Aktienmenü scheint ein unteres Blatt zu sein. Aber wie kann es erreicht werden? enter image description hereWie Anpassen von Share-Menü in Android?

Was ich getan habe: Ich habe leer Tätigkeit mit der Absicht, Filter in manifest, den Service und dieses Service Downloads Bild

<activity 
      android:name=".model.services.ShareActivity" 
      android:icon="@drawable/download_icon" 
      android:label="Save"> 
      <intent-filter 
       android:label="Save" 
       android:icon="@drawable/download_icon"> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*"/> 
      </intent-filter> 
     </activity> 

und jetzt habe ich dieses Symbol in Aktien Menü startet und es funktioniert, aber dieses Symbol erscheint auch im Freigabe-Menü anderer Apps, ich muss es nur in meiner App anzeigen, wie kann ich es privat machen oder so?

+0

Wird das Symbol auch in anderen Apps angezeigt? Wolltest du nicht in anderen Aktivitäten meinen? –

+0

Yeap, es erscheint in anderen Anwendungen, auch android Gallery hat meine App "Speichern" -Eintrag im Bild-Menü teilen, möchte ich meine "Speichern" Aktivität von anderen Anwendungen teilen Menü zu schließen –

Antwort

0

Ok, ich habe eine Lösung gefunden. Erstens - wir brauchen Aktivitäten, die mit der Bildspeicherungsabsicht umgehen, diese Aktivität kann den Dienst oder etwas starten. Ich mache es wie folgt aus:

public class ShareActivity extends Activity { 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle extras = getIntent().getExtras(); 
     String url = extras.getString("url"); 
     String name = extras.getString("name"); 
     String description = extras.getString("description"); 
     SaveImageService.downloadFile(url, name, description); 
     finish(); 
    } 
} 

Wo SaveImageService statische Methode hat die Zweite Bild Speichern auf SD-Karte handhaben, müssen wir einen Text in Manifest hinzufügen:

<activity 
     android:name=".model.services.ShareActivity" 
     android:icon="@drawable/download_icon" 
     android:label="Save"> 
     <intent-filter 
      android:label="Save" 
      android:icon="@drawable/download_icon"> 
      <action android:name="com.my_app.random_text.SAVE_IMAGE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="image/*"/> 
     </intent-filter> 
    </activity> 

Hier Intent-Filter-Aktion hat (Dies ist wichtig) diese benutzerdefinierte Aktion ist nur eine Zeichenfolge, nicht App-Paket oder etwas (ich verwende Paketnamen, nur weil ich es mag). Als nächstes müssen wir diese Aktivität hinzufügen Menüliste teilen:

dies Bitmap Uri erhält für in anderen Anwendungen von Image teilen

// Returns the URI path to the Bitmap displayed in specified ImageView 
    static public Uri getLocalBitmapUri(ImageView imageView) { 
     // Extract Bitmap from ImageView drawable 
     Drawable drawable = imageView.getDrawable(); 
     Bitmap bmp = null; 
     if (drawable instanceof BitmapDrawable) { 
      bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 
     } else { 
      return null; 
     } 
     // Store image to default external storage directory 
     Uri bmpUri = null; 
     try { 
      File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); 
      file.getParentFile().mkdirs(); 
      FileOutputStream out = new FileOutputStream(file); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 80, out); 
      out.close(); 
      bmpUri = Uri.fromFile(file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bmpUri; 
    } 

Und dies wird alle Anwendungen sammeln, das Bild teilen und unsere sparen Bildziel

public void shareExcludingApp(Context ctx, PhotoView snapImage) { 
     // Get access to the URI for the bitmap 
     Uri bmpUri = ShareTool.getLocalBitmapUri(snapImage); 
     if (bmpUri == null) return; 

     List<Intent> targetedShareIntents = new ArrayList<>(); 
     //get all apps which can handle such intent 
     List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(bmpUri), 0); 
     if (!resInfo.isEmpty()) { 
      for (ResolveInfo info : resInfo) { 
       Intent targetedShare = createShareIntent(bmpUri); 
       //add all apps excluding android system and ourselves 
       if (!info.activityInfo.packageName.equals(getContext().getPackageName()) 
         && !info.activityInfo.packageName.contains("com.android")) { 
        targetedShare.setPackage(info.activityInfo.packageName); 
        targetedShare.setClassName(
          info.activityInfo.packageName, 
          info.activityInfo.name); 
        targetedShareIntents.add(targetedShare); 
       } 
      } 
     } 
     //our local save feature will appear in share menu, intent action SAVE_IMAGE in manifest 
     Intent targetedShare = new Intent("com.my_app.random_text.SAVE_IMAGE"); //this is that string from manifest! 
     targetedShare.putExtra(Intent.EXTRA_STREAM, bmpUri); 
     targetedShare.setType("image/*"); 
     targetedShare.setPackage(getContext().getPackageName()); 
     targetedShare.putExtra("url", iSnapViewPresenter.getSnapUrlForSave()); 
     targetedShare.putExtra("name", iSnapViewPresenter.getSnapNameForSave()); 
     targetedShare.putExtra("description", iSnapViewPresenter.getSnapDescriptionForSave()); 
     targetedShareIntents.add(targetedShare); 

     //collect all this intents in one list 
     Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), 
       "Share Image"); 

     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
       targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()])); 

     ctx.startActivity(chooserIntent); 
    } 
Verwandte Themen