首页 技术 正文
技术 2022年11月12日
0 收藏 354 点赞 3,742 浏览 2470 个字

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

Android 不一样的原生分享Android 不一样的原生分享

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

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

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终须要彻彻底底地理解一番。本方法暂时未封装成工具类或组件,各位懂得用的园友们看了也能自己动手做一个,请啊!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287