Android做分享功能百度一下就两种方案,其一是用系统原生的Activity,最终弹出一个对话框,下面这种的还好,像右图的那种就嫌弃了,上面提供的应用也相对杂,还记得有次测试还给鄙人提了个Bug:建议分享中多列举常用的App如QQ微信等。

那另外一种方案就弥补了上面两种不足,使用第三方的,如ShareSDK,可以自定义界面,可以自己决定有哪些课分享的应用展示出来。但是我还是比较懒地嫌弃了,因为每开发一个引用都需要去申请一个Key,引用一堆的包。

所以我还是想找一个集合上面两种优势的方案,直到我看了Android原生的图库,我就觉得有希望了。最终试验结果如下

然后就继续引来更大的一波嫌弃:

还是那样的难看,比之前更难看。。。。。。。。。。。

可重点是,现在能把这些分享的应用信息都那得到了,并且也可以顺利的分享出去了。那剩下的事情就是把界面做得好看一点,把自己不喜欢的那些应用都筛选掉。实际上剩下的我都不做了。单纯讲讲怎么拿到这些分享信息数据和分享出去。

由于用的是系统原生的分享,故使用Intent是必不可少的,分享图片和分享文字的分别如下

         Intent intent=new Intent(Intent.ACTION_SEND);

         intent.setType("image/*");

         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

         intent.putExtra(Intent.EXTRA_STREAM, uri);
         Intent intent=new Intent(Intent.ACTION_SEND);

         intent.setType("text/plain");

         intent.putExtra(Intent.EXTRA_TEXT, sharecontentstring);

         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

与网上众多的方法相比,对Flags的设置有所不同,其余的还是一样的,接下来的则是不一样的

        List<ResolveInfo> resolveInfo=this.getPackageManager().queryIntentActivities(intent, 0);

         String label;

         Drawable icon;

         ResolveInfo info;

         HashMap<String,Object> item;

         datasource.clear();

         for(int i=0;i<resolveInfo.size();i++)

         {

             item=new HashMap<String,Object>();

              info=resolveInfo.get(i);

              label=info.loadLabel(getPackageManager()).toString();

              icon= info.loadIcon(getPackageManager());

              if(this.appNameMapping.containsKey(info.activityInfo.applicationInfo.packageName))

                  item.put("label", this.appNameMapping.get( info.activityInfo.applicationInfo.packageName)+"——"+label);

              else

                  item.put("label", label);

              item.put("icon", icon );

              item.put("resolve", resolveInfo.get(i));

              item.put("intent", intent);

              datasource.add(item);

         }

通过Context获取PackageManager,借助其筛选出符合这种Intent的Activity。得出了ResolveInfo。这个ResolveInfo就包含了分享应用的Activity信息,名称还有Icon,光靠这些信息就可以分享了,但是鄙人还想直接通过应用名来筛选出不需要显示在列表中的App,在上述代码中,appNameMapping就存放着包名和应用名的键值对,这个也是通过类似方法获取的

         List<ApplicationInfo> listAppcations = this.getPackageManager()

 .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

         for(ApplicationInfo info :listAppcations)

         {

             appNameMapping.put(info.packageName, info.loadLabel(getPackageManager()));

         }

当选择好需要分享的应用后,接下来就执行分享操作了

             ResolveInfo resolve=(ResolveInfo) datasource.get(index).get("resolve");

             ActivityInfo ai= resolve.activityInfo;

             Intent intent=new Intent((Intent) datasource.get(index).get("intent"));

             intent.setComponent( new ComponentName(ai.applicationInfo.packageName,ai.name) );

             startActivity(intent);

数据就如此被分享出去了。

稍微总结一下,这个方式仍有他的弊端,还没满足同时分享图片和文字,如果能做到那就更好了,或者是对Intent了解还没够深入,这个分享调用主要靠的是Intent,另外则是那堆Info类了。当初学习Android时对Intent了解还是很不明不白,Intent终须要彻彻底底地理解一番。本方法暂时未封装成工具类或组件,各位懂得用的园友们看了也能自己动手做一个,请啊!

Android 不一样的原生分享的更多相关文章

  1. Android应用中实现系统“分享”接口

    在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...

  2. Xamarin.Android 绑定友盟社会化分享组件

    Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...

  3. android studio git 将项目分享到github,推送到其他平台 码云 等。

    android studio git 将项目分享到github,推送到其他平台 码云 等. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E- ...

  4. Android H5调起原生微信或支付宝支付

    Android H5调起原生微信或支付宝支付 WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String ...

  5. Android 应用程序之间内容分享详解(一)

    一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...

  6. Android 应用程序之间内容分享详解(二)

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...

  7. iOS原生分享功能

    iOS_系统原生分享 - CSDN博客 通过UIActivityViewController实现更多分享服务 - 简书 UIActivity - UIKit _ Apple Developer Doc ...

  8. UIActivityViewController实现系统原生分享

    代码地址如下:http://www.demodashi.com/demo/11042.html 一.效果预览 二.接下来介绍UIActivityViewController,跟我动手做 1.创建要分享 ...

  9. wemall app商城源码Android之Native(原生)支付模式一demo

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Native(原生)支付模式一demo,供技术 ...

随机推荐

  1. Expert 诊断优化系列------------------内存不够用么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  2. 【javascript 技巧】Array.prototype.slice的妙用

    Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...

  3. 谷歌chrome浏览器www.tradeadexchange.com广告弹窗跳转劫持病毒

    近期大量网友出现chrome浏览器被劫持的情况,表现如下:           ·  点击(访问)任意网站任意链接均有概率弹出www.tradeadexchange.com.           ·  ...

  4. java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

    java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 严重: Exceptio ...

  5. xamarin UWP ActivityIndicator

    在xamarin的UWP平台使用ActivityIndicator时,如果你时后台创建的这个对象,请设置他的宽度,不然在UWP平台下会发现找不这个对象,其实是在这个平台和特点版本下的宽度没设置,导致有 ...

  6. ASP.net 常用服务器控件

    新人初学,有错请指,大神轻喷. .net中有HTML控件和标准服务器控件. 老师教学用的是vs2010是这样分的,不知道15里是不是这样. 如果使用HTML控件我们就会发现页面中加载了原本HTML代码 ...

  7. MonogDB初探增加和删除

    1.插入并保存文档       在插入数据之前,首先用mongodb Shell命令db.baseUser.find() 查找集合的数据.      想必大家能猜到结果,什么东西都没有,那接着来说说怎 ...

  8. C#设计模式-代理模式

    在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替 ...

  9. oracle数据库表的导入导出cmd命令大全

    在实际的项目开发中经常会遇到导入导出oracle数据库中的表,以下是常用的一些cmd命令: 一.数据表的导出 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daoch ...

  10. SQL语句来查询今天、昨天、7天内、30天的数据,经典!

    ---恢复内容开始--- 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * f ...