How to exclude a specific application from ACTION_SEND Intent?

后端 未结 6 530
伪装坚强ぢ
伪装坚强ぢ 2020-12-19 04:55

I have used the following codes to exclude facebook app from my app chooser:

 List targetedShareIntents = new ArrayList();
    In         


        
6条回答
  •  春和景丽
    2020-12-19 05:24

    For Android API 24 and above, you can use this:

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

    For the rest, you can have this solution I wrote about (which allows you to have a condition which to exclude

    Here's a more generalized solution, to be able to choose which to exclude for all Android versions:

    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
        }
    }
    

提交回复
热议问题