如何强制共享意图打开特定应用程序?

Posted

技术标签:

【中文标题】如何强制共享意图打开特定应用程序?【英文标题】:How to force Share Intent to open a specific app? 【发布时间】:2012-01-08 16:03:24 【问题描述】:

我喜欢分享意图,非常适合打开带有图像和文本参数的分享应用。

但现在我正在研究强制共享意图从列表中打开特定应用程序的方法,并为共享意图提供参数。

这是我的实际代码,它显示了手机上安装的共享应用程序列表。拜托,有人能告诉我我应该在代码中添加什么来强制例如官方推特应用程序吗?和官方 faccebok 应用?

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
Uri screenshotUri = Uri.parse("file:///sdcard/test.jpg");  
sharingIntent.setType("image/*");
sharingIntent.putExtra(Intent.EXTRA_TEXT, "body text");
sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
startActivity(Intent.createChooser(sharingIntent, "Share image using"));

谢谢

【问题讨论】:

您有 facebook 相关的问题吗? 如果他们不使用官方推特应用程序,这样做会失败吗?为什么要限制某人的分享方式? 【参考方案1】:

对于 Facebook

public void shareFacebook() 
        String fullUrl = "https://m.facebook.com/sharer.php?u=..";
        try 
            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
            sharingIntent.setClassName("com.facebook.katana",
                    "com.facebook.katana.ShareLinkActivity");
            sharingIntent.putExtra(Intent.EXTRA_TEXT, "your title text");
            startActivity(sharingIntent);

         catch (Exception e) 
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setData(Uri.parse(fullUrl));
            startActivity(i);

        
    

对于推特。

public void shareTwitter() 
        String message = "Your message to post";
        try 
            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
            sharingIntent.setClassName("com.twitter.android","com.twitter.android.PostActivity");
            sharingIntent.putExtra(Intent.EXTRA_TEXT, message);
            startActivity(sharingIntent);
         catch (Exception e) 
            Log.e("In Exception", "Comes here");
            Intent i = new Intent();
            i.putExtra(Intent.EXTRA_TEXT, message);
            i.setAction(Intent.ACTION_VIEW);
            i.setData(Uri.parse("https://mobile.twitter.com/compose/tweet"));
            startActivity(i);
        
    

【讨论】:

我可以为推文附上图片吗? 如果安装了 Twitter 应用程序,它会给出活动未找到异常 enen 完美!!!非常感谢!我已将 PDF 文件附加到我的意图中,如下所示:sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); 如果您想知道 setClassName 的字段,您可以使用:java.util.List<ResolveInfo> mApps = new ArrayList<ResolveInfo>(); PackageManager pManager = getPackageManager(); mApps = pManager.queryIntentActivities(target,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); 类名未知怎么办(系统Intent选择器可以) instagram 也有类似的东西吗?【参考方案2】:

有一种更通用的方法可以做到这一点,并且不需要知道应用程序意图的完整包名称。

看到这个帖子: How to customize share intent in Android?

【讨论】:

【参考方案3】:

100% 有效解决方案

如果您想在任何您想要的应用程序中分享某些内容或通过每个操作打开一个 url,只需使用此方法:

private void shareOrViewUrlViaThisApp(String appPackageName, String url) 
    boolean found = false;
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    
    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0);
    if (!resInfo.isEmpty())
        for (ResolveInfo info : resInfo) 
            if (info.activityInfo.packageName.toLowerCase().contains(appPackageName) ||
                    info.activityInfo.name.toLowerCase().contains(appPackageName) ) 
            
                intent.setPackage(info.activityInfo.packageName);
                found = true;
                break;
            
        
        if (!found)
            return;

        startActivity(Intent.createChooser(intent, "Select"));
    

然后简单地调用:

shareOrViewUrlViaThisApp(<your package name>,<your url>);

这个答案的灵感来自this。

【讨论】:

以上是关于如何强制共享意图打开特定应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中使用意图过滤器获取数据

如何制作隐式意图以在 youtube 应用程序中打开特定视频? [复制]

Android 深层链接 - 不显示意图选择器弹出窗口,强制打开应用

单击推送通知时对特定活动的意图。

将意图文件路径共享给文件管理器以打开该路径

从 Android 意图打开 Ionic (Capacitor) 应用程序中的特定页面