专栏首页恩蓝脚本android系统分享的自定义功能的示例代码

android系统分享的自定义功能的示例代码

分享功能是app中特别常见的功能,国内的app基本都支持分享到微信 QQ等主流的社交应用。至于分享功能的实现大多是使用第三方的share sdk一步到位,或者分享的app比较少比如就一个微信 那通常使用微信sdk的分享模块即可。但其实android系统就给我们提供过一种分享的实现方式,代码也比较简单如下

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.putExtra(Intent.EXTRA_TEXT, shareText);
    share.putExtra(Intent.EXTRA_SUBJECT, shareSubject);

    if (uri != null) {
      share.setType("image/*");
      share.putExtra(Intent.EXTRA_STREAM, uri);
    }
    context.startActivity(Intent.createChooser(share, title));

系统提供的短短不到十行代码,将分享列表 数据 展示 点击 跳转 跳转后分享内容的分享等一系列动作都集合完成了。这样确实给人干净利索的感觉,但随之问题也来了比如我分享列表中只有特定几个app,甚至把某个app放在第一个,还有点击Facebook的分享后分享方式我想用facebooksdk自带的,等等一些列自定义功能完成就比较麻烦。

对个别app的分享特别处理

从以上的代码可以看出,google官方定义出分享的key value一一对应规则。比如Intent.EXTRA_STREAM对应为分享图片的uri,Intent.EXTRA_TEXT对应为分享的text文本。从道理上讲如果分享到的app都遵循google定义的这规则我们就能通过官方这代码实现分享到所有app的功能。然而理想很丰满现实很骨感,比如我们项目中要求分享到的facebook就压根不遵守这规则,我们想实现分享到Facebook就必须用其sdk实现。于是我们就需要在分享列表中点击Facebook是单独走Facebook的分享逻辑。

  • 常规思维这是一个列表,我们监听列表item的点击事件即可,然而从实现该分享列表的代码 可以看出没有类似listview recyclerview控件,也没有adapter,扒了下源码和google找不到item的点击事件的监听,故该方案放弃了
  • 所以只能采用了自己实现分享列表,然后监听分享列表item点击事件单独处理的方式,也是符合常规思路

第一步:获取分享列表的数据

    private static List<List<ResolveInfo   getShareActivities() {
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    PackageManager pm = App.getInstance().getPackageManager();
    List<List<ResolveInfo   listArrayList = new ArrayList< ();
    List<ResolveInfo  activityList = pm.queryIntentActivities(sharingIntent, 0);
    List<ResolveInfo  newActivityList = new ArrayList< ();

    for (Iterator<ResolveInfo  it = activityList.iterator(); it.hasNext(); ) {
      ResolveInfo info = it.next();
      //过滤出facebook google+ whatapp twitter 分享app单独处理
      LogUtils.e("+++", info.activityInfo.packageName);
      if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc") || info.activityInfo.packageName.equals("com.facebook.katana") || info.activityInfo.packageName.equals("com.google.android.apps.plus") || info.activityInfo.packageName.equals("com.facebook.orca") || info.activityInfo.packageName.contains("whatsapp") || info.activityInfo.packageName.equals("com.twitter.android")) {
        if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc")) {
          it.remove();
        } else {
          newActivityList.add(info);
          it.remove();
        }
      }
    }
    //增加一条other数据
    newActivityList.add(null);
    listArrayList.add(newActivityList);
    listArrayList.add(activityList);
    return listArrayList;
  }

第二步:构建分享的列表,且定义点击事件等

public static void systemShareDialog(List<ResolveInfo  packages, Context context, String title, String shareText) {
    List<Intent  targetIntents = new ArrayList<Intent ();
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    SPM spm = new SPM();

    for (ResolveInfo candidate : packages) {
      String packageName = candidate.activityInfo.packageName;
      Intent target = new Intent(android.content.Intent.ACTION_SEND);
      target.setType("text/plain");
      target.putExtra(Intent.EXTRA_TEXT, shareText);
      //target.setPackage(packageName);
      //t will be able to handle the case of multiple activities within the same app that can handle this intent. Otherwise, a weird item of "Android System" will be shown
      target.setComponent(new ComponentName(packageName, candidate.activityInfo.name));

      targetIntents.add(target);
    }
//    createchooser时使用targetIntents.remove(0)即传入targetIntents的第一个intent,并将其移除,
//
//    否则执行chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));添加后启动时会出现两个相同的应用
    Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title);
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
    context.startActivity(chooserIntent);

  }

总结

至此完成了基于android系统提供的分享方式上的扩展改造,自定义分享列表数据展示 自定义点击后的分享形式等等都可以实现。。其实此功能中Intent.createChooser所做工作还是蛮多的,有兴趣童鞋可以再去扒下起源码,看具体实现和到底做了哪些工作。

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅析Centos7搭建samba服务器方法

    配置ip地址 (教程:https://www.zalou.cn/article/135269.htm)

    砸漏
  • Flutter 实现下拉刷新上拉加载的示例代码

    https://gitee.com/cxyzy1/flutter_pulldown_refresh

    砸漏
  • Android实现图片在屏幕内缩放和移动效果

    通常我们遇到的图片缩放需求,都是图片基于屏幕自适应后,进行缩放和移动,且图片最小只能是自适应的大小。最近遇到一个需求,要求图片只能在屏幕内缩放和移动,不能超出屏...

    砸漏
  • 某IOT蠕虫病毒分析之UPX脱壳实战

    ? ? 关于upx的脱壳的文章比较多,基本上都是Windows平台下的脱壳文章,处理起来比较简单。FormSec将在本文中分析一款mips下病毒程序使用的u...

    xfkxfk
  • 谷歌大脑背后的大脑Jeff Dean:最快15年实现通用人工智能

    【新智元导读】《福布斯》网站今日刊文,专访“谷歌大脑背后的大脑”Jeff Dean。Dean回顾了他自1999年加入至今在公司的不同角色,重点介绍了谷歌大脑的项...

    新智元
  • Fortify Audit Workbench 笔记 Cross-Site Scripting-Persistent

    数据通过一个不可信赖的数据源进入 Web 应用程序。 对于 Persistent(也称为 Stored) XSS,不可信赖的源通常为数据库或其他后端数据存储,而...

    用户1637609
  • Android利用Intent.ACTION_SEND进行分享

    安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个ACTION_SEND的Intent,系统就为我们弹出一个应用程序列表。其...

    砸漏
  • Supervisord远程命令执行漏洞(CVE-2017-11610)

    前几天Supervisord出现了一个需认证的远程命令执行漏洞(CVE-2017-11610),在对其进行分析以后,将靶场加入了Vulhub豪华套餐: http...

    phith0n
  • 抓粉丝抓螃蟹抓洗发水……这款国产软体机械手火了

    这两天,一个中国研发的气动软体机器人夹具备受关注 大家看一下下面这张图 抓取仙人掌(看着都疼) ↓↓ ? 传统夹持装置与抓持对象之间一般是刚性接触 难以实现对易...

    机器人网
  • 情感机器:人类的19大思维方式

    大数据文摘

扫码关注云+社区

领取腾讯云代金券