Custom intent-chooser - why on Android 6 does it show empty cells?

前端 未结 1 492
悲&欢浪女
悲&欢浪女 2020-12-18 15:45

Background

I wish to show the native intent-chooser, while having the ability to customize it a bit.

For this, I\'ve found the next StackOverflow thread:

1条回答
  •  [愿得一人]
    2020-12-18 16:04

    I spend some time to read ChooserActivity and ResolverActivity and kind of solving thoese problems.

        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        List resolveInfos = context.getPackageManager().queryIntentActivities(intent, 0);
    
        if (resolveInfos != null && !resolveInfos.isEmpty()) {
            List targetIntents = new ArrayList<>();
            for (ResolveInfo resolveInfo : resolveInfos) {
                ActivityInfo activityInfo = resolveInfo.activityInfo;
                // remove activities which packageName contains 'ttt' for example
                if (activityInfo.packageName.contains("ttt")) {
                    continue;
                }
                Intent targetIntent = new Intent(Intent.ACTION_SEND);
                targetIntent.setType("text/plain");
                targetIntent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.setting_share_app_subject));
                targetIntent.putExtra(Intent.EXTRA_TEXT, context.getString(R.string.setting_share_app_body));
                targetIntent.setPackage(activityInfo.packageName);
                targetIntent.setComponent(new ComponentName(activityInfo.packageName, activityInfo.name));
    
                // wrap with LabeledIntent to show correct name and icon
    
                LabeledIntent labeledIntent = new LabeledIntent(targetIntent, activityInfo.packageName, resolveInfo.labelRes, resolveInfo.icon);
    
                // add filtered intent to a list
                targetIntents.add(labeledIntent);
            }
            Intent chooserIntent;
            // deal with M list seperate problem
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // create chooser with empty intent in M could fix the empty cells problem
                chooserIntent = Intent.createChooser(new Intent(), context.getString(R.string.setting_share_app_title));
            } else {
                // create chooser with one target intent below M
                chooserIntent = Intent.createChooser(targetIntents.remove(0), context.getString(R.string.setting_share_app_title));
            }
            if (chooserIntent == null) {
                return;
            }
            // add initial intents
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[targetIntents.size()]));
            try {
                context.startActivity(chooserIntent);
            } catch (ActivityNotFoundException e) {
                Logger.e(TAG, e, e);
            }
        }
    

    EDIT: seems on Android Q (10 - API 29) this is broken, and will show just up to 2 items instead of all of them. Asked about this again here.

    EDIT: made a sample of choosing which items to exclude from sharing, here, which should work for all Android versions.

    0 讨论(0)
提交回复
热议问题