目前在公司的项目中用到的分享都是集成的第三方的分享。比如常见的QQ分享,QQ空间,微信,新浪微博等分享到第三方的分享,在这些分享功能实现的时候,基本声就是拿到第三方分享的SDK,然后集成到我们自己的项目当中来。进行自定义分享,调用第三方的分享接口进行实现内容的分享。比较简单常见。最最常见的第三方的sdk有ShareSDK,友盟分享。顺便说一句,友盟除了分享意外,还提供友盟统计等模块的功能。
昨天和朋友一起研究github上的一些基于android5.0新特性的框架的时候,偶尔注意到顶部ToolBar中有个分享功能。可以列出设备中所有支持分享的应用列表,然后将要分享的内容进行分享。所以今天就研究了一下。其实这种功能现在在一些app应用上已经可以看到或者见到了,比如昨天看到那个功能效果后,我就立即想到了知乎客户端详情页面的顶部分享功能,那个就是支持列出所有支持分享的应用列表进行分享。
下面少说多做,直接上代码。然后进行解释。顺便说一句,google官方文档就是最好的老师。编程其实就是照猫画虎,最有效的学习方式也是从模仿开始的。下面上干货。
如果想要查看google文档,可以去搜:Adding an Action Provider
根据google文档的说明,要想进行ToolBar的分享。需要分两步进行。
1. 在对应的分享页面Activity的menu文件中添加item:具体如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/socialshare" android:title="share" app:showAsAction="always" android:icon="@android:drawable/ic_menu_share" app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" app:showAsAction="ifRoom" /> </menu>
2.Activtiy中相应的代码处理:在onCreateOptionsMenu方法中进行相应代码处理:
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem item = menu.findItem(R.id.socialshare); mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); mShareActionProvider.setShareIntent(getDefaultIntent()); return true;getDefaultIntent方法内容如下:private Intent getDefaultIntent(){ Intent intent = new Intent(Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, " the share text "); return intent; }注意事项:1.关于引入jar包和类库的问题。由于是5.1的sdk,Activity继承的是ActionBarActivity。还引入了V7包的支持。SahreActionProvider引用的是V7包中的类。在代码中相应的需要用V4包中的MenuItemCompat来进行获取ShareAtionProvider。。。特别注意,到此,运行app,会出现崩溃的现象。异常总是提示nullPointException,具体描述如下:09-16 19:26:38.250: E/AndroidRuntime(22440): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ShareActionProvider.setShareIntent(android.content.Intent)' on a null object reference。该问题困扰了我将近两个小时。百度,google,stackoverflow都无法解决。最后还是在万能的国外论坛找到了问题。问题的解决的方法就是:menu.xml文件里面生命分享的item时actionProviderClass属性的前缀名一定要是app。。一定要。原文答案如下:Are you sure that you changed in xml to app:actionProviderClass? you must use the app prefix. the error android.support.v7.widget.ShareActionProvider is not assignable to android.view.ActionProvider say it not thw right one.英文水平有限,不再翻译。大家自己去翻译吧。
2.关于分享的Intent的问题,对于系统自带的分享,我们在分享的时候传入一个Intent就可以。所以,我们可以通过设置自定义的Intent来进行分享我们想要分享的内容:比如上文getDefautIntent方法中对于intent的封装。其实理解起来很简单。这是只是作为步骤提出来,让大家更加清晰整个分享功能实现的过程和步骤。
后记:最近比较烦。事多,自己静不下心来学习,效率总是提不上去。。。归根到底是自己心不静。。没有集中精力放到学习和项目上。脸皮太薄。。爱面子也会学不到东西。以后要改正。另外,从本周开始,周六计划单独去公司加班学习。看执行力吧。晚安。