【问题标题】:Detect the sharer used to share some content检测用于分享某些内容的分享者
【发布时间】:2012-09-26 10:20:21
【问题描述】:

在我目前正在处理的应用程序中,我需要知道用户用于共享内容的“ACTION_SEND 共享者”(Twitter、Facebook、SMS、电子邮件...),以便出于统计目的对其进行记录。有什么办法吗?

我有一些想法,其中之一是修改这些共享者的目标 Intent 以指向接收者 Intent,该接收者 Intent 将接收选择的共享者,对这些数据执行我们需要的任何操作,然后调用目标共享者的最终 Intent (推特、脸书、短信、电子邮件……)。对于这最后一步,我想我需要知道每个目标应用程序的 share Action。

问候

更新1

为了说明,我分享了我目前用来分享内容的方法,根据目标分享者自定义 Intent extras:

    private void shareItem(String title, String link) {
    // Standard message to send
    String msg = title + " " + link;

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");

    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
    if (!resInfo.isEmpty()) {
        List<Intent> targetedShareIntents = new ArrayList<Intent>();
        Intent targetedShareIntent = null;

        for (ResolveInfo resolveInfo : resInfo) {
            String packageName = resolveInfo.activityInfo.packageName;
            targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND);
            targetedShareIntent.setType("text/plain");

            // Find twitter: com.twitter.android...
            if ("com.twitter.android".equals(packageName)) {
                targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, msg);
            } else if ("com.google.android.gm".equals(packageName)) {
                targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
                targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, Uri.encode(title + "\r\n" + link));
            } else if ("com.android.email".equals(packageName)) {
                targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
                targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, Uri.encode(title + "\n" + link));
            } else {
                // Rest of Apps
                targetedShareIntent.putExtra( android.content.Intent.EXTRA_TEXT, msg);
            }

            targetedShareIntent.setPackage(packageName);
            targetedShareIntents.add(targetedShareIntent);
        }

        Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), getResources().getString(R.string.share));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));
        startActivityForResult(chooserIntent, 0);
    }
}

已解决

按照此链接上的指示:http://goo.gl/hf8Kg

【问题讨论】:

  • 你能解释一下 this-R.string.share 包含什么吗?
  • @Basim Sherif 这只是一个包含对话框标题的资源字符串(类似于“与...共享”)。

标签: android android-intent broadcastreceiver share intentfilter


【解决方案1】:

有没有办法做到这一点?

您可以通过PackageManagerqueryIntentActivities() 显示您自己的选择器对话框。

【讨论】:

  • 是的,我目前正在使用 queryIntentActivities() 创建我自己的选择器对话框来自定义共享者的 Intent 附加内容(例如,如果它是 Twitter 共享者或电子邮件共享者,我会放置不同的附加内容),但是我需要的是类似“回调”或某种“拦截”(这是我现在正在调查的)来了解用户使用的共享器。感谢您的回答!
  • @jihonrado:我看不出你的方法是如何起作用的。我的建议是您显示 您自己的对话框,其中 you 是填充对话框的人,而 you 是获得控制权的人当用户点击该对话框中的某些内容时。届时,除了记录用户的选择之外,将负责启动所选活动。
  • 使用说明性代码更新的问题。我想要做的是修改它以将 Intent 发送到自定义中间接收器,对数据做一些事情,然后根据额外的值(例如 sharer=twitter,sharer=email...),调用新 Intent 直接到 Twitter 应用程序、电子邮件应用程序......我不确定这是否可能。
  • @jihonrado:“用说明性代码更新了问题”——正如我所写,我看不出你的方法是如何工作的。
  • 我认为你是对的。经过一番调查,我陷入了僵局。我刚刚找到了这个(goo.gl/hf8Kg),这就是你提出的,所以我会试一试。
猜你喜欢
  • 2013-05-30
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多