【问题标题】:Hide own implicit Intent from share list从共享列表中隐藏自己的隐式 Intent
【发布时间】:2016-04-02 18:38:55
【问题描述】:

Twitter Android 应用程序有(至少)两个意图过滤器。一种用于发推文,另一种用于直接消息。

当您想通过 twitter(从另一个应用程序)分享某些内容时,您通常会在隐式意图列表中看到这两个项目(如下面的第一张图片所示)。

当您想从 twitter 应用程序分享某些内容时,您会得到相同的意图,但只有一个选项(直接消息)。其他选项以某种方式被删除。请参阅第二张图片以供参考。

我的问题是,Twitter 应用程序是如何做到这一点的?

我相信他们会查询可以处理内容的应用程序并从那里删除自己的意图(推文),并在自定义的 BottomSheet 中显示结果。我相信是这样的,因为 BottomSheet 的退出动画与其他应用的标准 Share BottomSheet 动画有点不同。

如果不是自定义的,有没有其他方法可以在自己的应用中过滤自己的意图?

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    尝试通过您希望在对话框中显示的应用进行共享

    public void onShareClick(View v){
    List<Intent> targetShareIntents=new ArrayList<Intent>();
    Intent shareIntent=new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    List<ResolveInfo> resInfos=getPackageManager().queryIntentActivities(shareIntent, 0);
    if(!resInfos.isEmpty()){
        System.out.println("Have package");
        for(ResolveInfo resInfo : resInfos){
            String packageName=resInfo.activityInfo.packageName;
            Log.i("Package Name", packageName);
            if(packageName.contains("com.twitter.android") || packageName.contains("com.facebook.katana") || packageName.contains("com.kakao.story")){
                Intent intent=new Intent();
                intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "Text");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                intent.setPackage(packageName);
                targetShareIntents.add(intent);
            }
        }
        if(!targetShareIntents.isEmpty()){
            System.out.println("Have Intent");
            Intent chooserIntent=Intent.createChooser(targetShareIntents.remove(0), "Choose app to share");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }else{
            System.out.println("Do not Have Intent");
            showDialaog(this);
        }
    }
    }
    

    【讨论】:

    • 非常感谢,但这并不能回答问题。我知道这种方式,我知道我可以手动过滤,但我的问题是是否有其他方式或者 Twitter 是否也这样做。
    • 可能还有其他方法,但我认为 twitter 的人正在手动操作。
    • 您还知道哪些其他方式?为什么你认为 Twitter 是手动做的?
    • 他们还能用什么?我认为他们也在手动进行。如果对您有所帮助,请支持我的回答。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多