【问题标题】:Branching the Android Share Intent extras depending on which method they choose to share根据他们选择共享的方法来分支 Android Share Intent extra
【发布时间】:2013-01-05 05:30:30
【问题描述】:

只是想分享一个动态文本字符串 + 应用程序的 URL。原生 Android 共享意图设置正确,并且与 Twitter、Gmail 等完美配合。但是,正如许多人猜测的那样,它不适用于 Facebook。显然是因为 Facebook 不接受 intent.EXTRA_TEXT 字段中的文本,只接受一个 URL。

嗯,我要问你们的问题是:有没有办法根据他们选择分享的方法来分支分享意图额外内容?例如,如果他们通过 gmail 或 Twitter 分享,请使用现有的 String + URL(所需选项)EXTRA_TEXT,但如果他们选择通过 Facebook 分享,则仅使用 URL 作为 EXTRA_TEXT

真的不想为 Android 中内置的如此简单的任务实现 Facebook Android SDK。

感谢您的时间和建议。

尝试过这样的事情,但显然失败了,因为它只检查共享选项是否存在(当共享弹出时,而不是在他们单击共享方法后),当他们选择方法时它没有响应。

  String shareBody = "app string text " + act_txt + " more text! Get the app at http://www.appurl.com";

 PackageManager pm = view.getContext().getPackageManager();
    List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
    for(final ResolveInfo app : activityList) {
         Log.i(TAG, "app.actinfo.name: " + app.activityInfo.name);
        //if((app.activityInfo.name).contains("facebook")) {
              if("com.facebook.katana.ShareLinkActivity".equals(app.activityInfo.name)) {


            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "http://www.appurl.com");
            startActivity(Intent.createChooser(sharingIntent, "Share idea"));
            break;
        } else {
            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "app name");
            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
            startActivity(Intent.createChooser(sharingIntent, "Share"));
            break;
        }
    }

【问题讨论】:

    标签: android facebook android-intent facebook-sharer


    【解决方案1】:

    找到了解决方案,在这个 SO 问题上要求别的东西:https://stackoverflow.com/a/8550043/1938669

    在此处发布我最初的问题的尝试很接近。在可能的 shareIntent 列表的循环中,您需要针对特定​​的共享选择(如 facebook 或 twitter)创建一个新的共享意图

    这是一个最终可行的解决方案,如果选择 facebook,则仅共享一个 URL,否则共享完整的文本字符串 + url:

    public void shareIt(View view){
        //sharing implementation
        List<Intent> targetedShareIntents = new ArrayList<Intent>();
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        String shareBody = "string of text " + txt_var + " more text! Get the app at http://someapp.com";
    
        PackageManager pm = view.getContext().getPackageManager();
        List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
        for(final ResolveInfo app : activityList) {
    
             String packageName = app.activityInfo.packageName;
             Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND);
             targetedShareIntent.setType("text/plain");
             targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "share");
             if(TextUtils.equals(packageName, "com.facebook.katana")){
                 targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "http://someurl.com");
             } else {
                 targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
             }
    
             targetedShareIntent.setPackage(packageName);
             targetedShareIntents.add(targetedShareIntent);
    
        }
    
        Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Share Idea");
    
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
        startActivity(chooserIntent);
    
    }
    

    【讨论】:

    • 为什么要从targetedShareIntents中删除(0)
    • 调用 remove(0) 是因为传递给 createChooser 的意图将被再次“包装”。所以结果将是位置 0 的 2 倍。但我找到了不同的解决方案。只需使用不存在的包名称定义一个 Intent。 - 因为 remove(0) 会导致选择器,其中位置 0 上的 Intent 在所有其他 Intent 下方以新行分隔。我不想那样。
    • 编辑:似乎在较低的 API(使用 API 19 测试)上,无法使用包名不存在的 Intent。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多