Android 不一样的原生分享
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 不一样的原生分享的更多相关文章
- Android应用中实现系统“分享”接口
在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...
- Xamarin.Android 绑定友盟社会化分享组件
Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...
- android studio git 将项目分享到github,推送到其他平台 码云 等。
android studio git 将项目分享到github,推送到其他平台 码云 等. 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E- ...
- Android H5调起原生微信或支付宝支付
Android H5调起原生微信或支付宝支付 WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String ...
- Android 应用程序之间内容分享详解(一)
一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...
- Android 应用程序之间内容分享详解(二)
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...
- iOS原生分享功能
iOS_系统原生分享 - CSDN博客 通过UIActivityViewController实现更多分享服务 - 简书 UIActivity - UIKit _ Apple Developer Doc ...
- UIActivityViewController实现系统原生分享
代码地址如下:http://www.demodashi.com/demo/11042.html 一.效果预览 二.接下来介绍UIActivityViewController,跟我动手做 1.创建要分享 ...
- wemall app商城源码Android之Native(原生)支付模式一demo
wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Native(原生)支付模式一demo,供技术 ...
随机推荐
- ASP.NET MVC 多语言方案
前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...
- Nova PhoneGap框架 第四章 本地数据库
我一直想把EntityFramework(简称EF)的那一套搬过来,应用于HTML5 SQLite. 幸运的是,我几乎做到了,有些功能无法完成的那是因为SQLite本身不支持.至少从现在已经完成的功能 ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- Some warning were found during validation
前几天做一个iOS下的App更新,到上传的时候出了问题,一直传了大半个小时,结果还是没传完,再试依然不行,于是只好关机,把电脑带回家弄. 回家后出现了更奇怪的事,经过漫长等待后,竟然出现这个提示: 我 ...
- Viewport---响应式 Web 设计----在路上(13)
什么是 Viewport? viewport 是用户网页的可视区域. viewport 翻译为中文可以叫做"视区". 手机浏览器是把页面放在一个虚拟的"窗口"( ...
- python的shutil模块
shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 1.复制文件 def copy(src, dst): """Co ...
- 【WP开发】加密篇:双向加密
说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES.AES等.在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不 ...
- 实战MEF(1):一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
- PHP性能测试工具xhprof安装与使用
原文链接:http://www.orlion.ga/711/ 一.安装 wget https://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0. ...
- ASP.NET Core的配置(1):读取配置信息
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...