2016-05-10 12 views
0

Ich benutze Androids Standard Share Intent, um ein Bild mit anderen Apps zu teilen. Aber ich möchte eine Option wie Save to Gallery hinzufügen, die dieses Bild direkt in der Galerie in Medien oder Bildern oder im Ordner meiner App speichert.Share Bild Absicht mit benutzerdefinierten Speichern in Galerie Option

Derzeit bin ich mit der einfachen Code-Bild zu teilen:

Intent shareIntent = new Intent(); 
shareIntent.setAction(Intent.ACTION_SEND); 
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); 
shareIntent.setType("image/jpeg"); 
startActivity(Intent.createChooser(shareIntent, "Share to")); 

Als ich WhatsApp Share-Taste aus Profilbild versuchte, gibt es eine Möglichkeit, "Save To Gallery" Option. Jetzt habe ich erfahren, dass es nicht in Android vor-Build ist. Das ist die manuelle Aktion, die WhatsApp hinzugefügt hat und die ein Bild irgendwie in einen bestimmten Pfad speichert. Wenn Sie lange drücken, zeigt die Schaltfläche "Save to gallery" an, dass diese Aktion der WhatsApp-App entspricht. Das bedeutet, dass WhatsApp eine Logik dafür geschrieben hat. Es ist der gleiche Standard ACTION_SEND Absicht mit image/* Mime-Typ mit einer zusätzlichen benutzerdefinierten Aktion "Save to Gallery".

Das ist völlig in Ordnung. Ich möchte diese Art von Logik auch für meine App hinzufügen. Ich kann <intent-filter> registrieren, das diese Handlung behandeln kann, aber es wird global jedes mögliches Bild von irgendeiner Anwendung annehmen, um in Galerie zu speichern.

Wie kann ich eine manuelle Aktion für meine Freigabe Intent oder <intent-filter> Aktivität hinzufügen, die nur für meine App spezifisch sein kann (nur für meine App sichtbar) und dem Zweck dient, ein Bild in der Galerie zu speichern?

Antwort

3

Das folgende Code-Snippet macht folgendes: Zuerst fragen wir das System nach IntentActivities, die unsere Share-Intent verarbeiten können. Danach erstellen wir eine Liste von LabeledIntents. Schließlich fügen wir unsere benutzerdefinierte Freigabeaktion zu dieser Liste hinzu und wir präsentieren die Liste dem Benutzer mit dem Standardauswahldialog.

public Intent getNativeShareIntent(final Context context) { 
    final String defaultChannel = shareObject.getDefaultChannel(); 

    final PackageManager pm = context.getPackageManager(); 
    final Intent sendIntent = new Intent(Intent.ACTION_SEND); 
    sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); 
    sendIntent.setType("image/jpeg");  
    List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0); 
    List<LabeledIntent> intentList = new ArrayList<>(); 

    for (int i = 0; i < resInfo.size(); i++) { 
     ResolveInfo ri = resInfo.get(i); 
     String packageName = ri.activityInfo.packageName;   
     final Intent intent = new Intent(); 
     intent.setComponent(new ComponentName(packageName, ri.activityInfo.name)); 
     intent.setPackage(packageName); 
     intent.setAction(Intent.ACTION_SEND); 
     intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); 
     intent.setType("image/jpeg");  
     intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), 
       ri.getIconResource())); 
    } 

    // TODO Implement the method getSaveToGalleryIntent, 
    // Could be a simple intent linking to activity. 
    intentList.add(getSaveToGalleryIntent(context)); 

    Intent openInChooser = Intent.createChooser(intentList.remove(0), 
     "Share"); 
    LabeledIntent[] extraIntents = intentList.toArray(new LabeledIntent[intentList.size()]); 
    openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents); 
    return openInChooser; 
} 

private Intent getSaveToGalleryIntent(final Context context, final Uri imgUrl) { 
    final Intent intent = new Intent(context, SaveToGalleryActivity.class); 
    intent.putExtra(SaveToGalleryActivity.EXTRA_KEY_CONTENT, imgUrl); 
    return new LabeledIntent(intent, BuildConfig.APPLICATION_ID, 
     "Save to gallery", 
     R.drawable.ic_save_to_gallery); 
} 
+0

Können wir eine Methode aufrufen (um ein Bild herunterzuladen und in die Galerie zu speichern), wenn Sie auf Speichern klicken, statt eine Aktivität aufzurufen? –

+0

Sie müssen eine Absicht hinzufügen. Sie können eine Methode mit einer Intent nicht direkt aufrufen. Aber Sie können versuchen, z.B. eine Broadcast-Empfänger-Absicht, anstatt eine Aktivität aufzurufen. – Christopher

Verwandte Themen