2010-10-31 18 views
19

La aplicación tiene un filtro de intención para permitir que aparezca en el menú Compartir en otras aplicaciones mediante ACTION_SEND intents. La aplicación en sí también tiene un menú compartido que usa ACTION_SEND y createChooser(), y mi aplicación aparece en la lista. Como ya están en mi aplicación, parece extraño que puedan volver a compartir.¿Cómo excluir su propia aplicación del menú Compartir?

¿Hay alguna manera de que mi aplicación no aparezca en la lista si se está llamando desde mi aplicación?

Respuesta

8

¿Hay alguna manera de que mi aplicación no aparezca en la lista si la llaman desde mi aplicación?

No a través de createChooser(). Puede crear su propio cuadro de diálogo como selector en PackageManager y queryIntentActivities() y filtrarse de esa manera.

+0

esto hay algo construido en el que se puede alimentar a mi lista filtrada vuelta en, para crear el cuadro de diálogo Compartir, o tengo que crear mi propio cuadro de diálogo usando la lista? Si es el último, ¿cómo aparece el ícono de la aplicación en un diálogo? Gracias. – cottonBallPaws

+1

@littleFluffyKitty: usaría su propio cuadro de diálogo (por ejemplo, 'AlertDialog.Builder' y' setAdapter() '). 'PackageManager' puede darle los iconos. Ver http://github.com/commonsguy/cw-advandroid/tree/master/Introspection/Launchalot/ – CommonsWare

+0

gracias, eso es realmente útil. ¿Tiene alguna sugerencia que sea la mejor manera de comparar/filtrar la lista devuelta por queryIntentActivities() contra mi aplicación? Estaba pensando en usar el nombre del paquete, pero ¿hay una mejor comparación? – cottonBallPaws

19

Aquí va su solución. Si desea excluir su aplicación se puede cambiar "packageNameToExclude" con ctx.getPackageName()

public static Intent shareExludingApp(Context ctx, String packageNameToExclude, String imagePath, String text) { 
    List<Intent> targetedShareIntents = new ArrayList<Intent>(); 
    Intent share = new Intent(android.content.Intent.ACTION_SEND); 
    share.setType("image/*"); 
    List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(text,new File(imagePath)), 0); 
    if (!resInfo.isEmpty()) { 
     for (ResolveInfo info : resInfo) { 
      Intent targetedShare = createShareIntent(text,new File(imagePath)); 

      if (!info.activityInfo.packageName.equalsIgnoreCase(packageNameToExclude)) { 
       targetedShare.setPackage(info.activityInfo.packageName); 
       targetedShareIntents.add(targetedShare); 
      } 
     } 

     Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), 
       "Select app to share"); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
       targetedShareIntents.toArray(new Parcelable[] {})); 
     return chooserIntent; 
    } 
    return null; 
} 

private static Intent createShareIntent(String text, File file) { 
    Intent share = new Intent(android.content.Intent.ACTION_SEND); 
    share.setType("image/*"); 
    if (text != null) { 
     share.putExtra(Intent.EXTRA_TEXT, text); 
    } 
    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); 
    return share; 
} 
+0

Esto me funciona ... solo tengo una pregunta sobre este targetShareIntents.remove (0) ... ¿por qué hiciste eso? –

+1

Porque necesita dar un intento al método del creador de Selector y luego agregar el resto de los intentos como un – Addev

+0

extra No funciona. Muestra objetivos compartidos extraños y varias aplicaciones no aparecen en la lista. –

1

que puedes usar

Intent chooserIntent = Intent.createChooser(new Intent(), "Select app to share"); 
Cuestiones relacionadas