Saltar al contenido

¿Cómo excluir una aplicación específica de ACTION_SEND Intent?

Hola, hemos encontrado la respuesta a lo que buscabas, continúa leyendo y la obtendrás un poco más abajo.

Solución:

Comprueba mi respuesta a continuación. Excluirá solo la aplicación de Facebook para compartir.

 void shareOnOtherSocialMedia() 

    List shareIntentsLists = new ArrayList();
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    List resInfos = getPackageManager().queryIntentActivities(shareIntent, 0);
    if (!resInfos.isEmpty()) 
      for (ResolveInfo resInfo : resInfos) 
        String packageName = resInfo.activityInfo.packageName;
        if (!packageName.toLowerCase().contains("facebook")) 
          Intent intent = new Intent();
          intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
          intent.setAction(Intent.ACTION_SEND);
          intent.setType("image/*");
          intent.setPackage(packageName);
          shareIntentsLists.add(intent);
        
      
      if (!shareIntentsLists.isEmpty()) 
        Intent chooserIntent = Intent.createChooser(shareIntentsLists.remove(0), "Choose app to share");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, shareIntentsLists.toArray(new Parcelable[]));
        startActivity(chooserIntent);
       else
        Log.e("Error", "No Apps can perform your task");

    
  
}

Y llame a la función anterior donde quiera. Avísame para consultas.

Android N (API 24) presenta la lista negra Intent.EXTRA_EXCLUDE_COMPONENTS, que es mejor y más simple que la lista blanca Intent.EXTRA_INITIAL_INTENTS.

Para la API de Android 24 y superior, puede usar esto:

val components = arrayOf(ComponentName(applicationContext, YourActivity::class.java))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
   startActivity(Intent.createChooser(intent, null).putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS,components))

Por lo demás, puede tener esta solución sobre la que escribí (que le permite tener una condición que excluir

Aquí hay una solución más generalizada, para poder elegir cuál excluir para todas las versiones de Android:

class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val targetIntent = Intent(Intent.ACTION_SEND)
        targetIntent.type = "text/plain"
        targetIntent.putExtra(Intent.EXTRA_SUBJECT, "subject")
        targetIntent.putExtra(Intent.EXTRA_TEXT, "text")
        val excludedAppsPackageNames = hashSetOf( "com.pushbullet.android","com.android.bluetooth","com.google.android.apps.docs","com.google.android.gm")
        getIntentChooser(this, targetIntent, "choose!", object : ComponentNameFilter 
            override fun shouldBeFilteredOut(componentName: ComponentName): Boolean = excludedAppsPackageNames.contains(componentName.packageName)
        )?.let  startActivity(it) 
    

    interface ComponentNameFilter 
        fun shouldBeFilteredOut(componentName: ComponentName): Boolean
    

    private fun getIntentChooser(context: Context, intent: Intent, chooserTitle: CharSequence? = null, filter: ComponentNameFilter): Intent? 
        val resolveInfos = context.packageManager.queryIntentActivities(intent, 0)
//        Log.d("AppLog", "found apps to handle the intent:")
        val excludedComponentNames = HashSet()
        resolveInfos.forEach 
            val activityInfo = it.activityInfo
            val componentName = ComponentName(activityInfo.packageName, activityInfo.name)
//            Log.d("AppLog", "componentName:$componentName")
            if (filter.shouldBeFilteredOut(componentName))
                excludedComponentNames.add(componentName)
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
            return Intent.createChooser(intent, chooserTitle).putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames.toTypedArray())
        
        if (resolveInfos.isNotEmpty()) 
            val targetIntents: MutableList = ArrayList()
            for (resolveInfo in resolveInfos) 
                val activityInfo = resolveInfo.activityInfo
                if (excludedComponentNames.contains(ComponentName(activityInfo.packageName, activityInfo.name)))
                    continue
                val targetIntent = Intent(intent)
                targetIntent.setPackage(activityInfo.packageName)
                targetIntent.component = ComponentName(activityInfo.packageName, activityInfo.name)
                // wrap with LabeledIntent to show correct name and icon
                val labeledIntent = LabeledIntent(targetIntent, activityInfo.packageName, resolveInfo.labelRes, resolveInfo.icon)
                // add filtered intent to a list
                targetIntents.add(labeledIntent)
            
            val chooserIntent: Intent?
            // deal with M list seperate problem
            chooserIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                // create chooser with empty intent in M could fix the empty cells problem
                Intent.createChooser(Intent(), chooserTitle)
             else 
                // create chooser with one target intent below M
                Intent.createChooser(targetIntents.removeAt(0), chooserTitle)
            
            if (chooserIntent == null) 
                return null
            
            // add initial intents
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toTypedArray())
            return chooserIntent
        
        return null
    

Aquí puedes ver las reseñas y valoraciones de los usuarios

Al final de todo puedes encontrar las notas de otros usuarios, tú de igual forma tienes el poder dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *