Android 自带的 分享 功能

      目前在公司的项目中用到的分享都是集成的第三方的分享。比如常见的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的封装。其实理解起来很简单。这是只是作为步骤提出来,让大家更加清晰整个分享功能实现的过程和步骤。
    后记:最近比较烦。事多,自己静不下心来学习,效率总是提不上去。。。归根到底是自己心不静。。没有集中精力放到学习和项目上。脸皮太薄。。爱面子也会学不到东西。以后要改正。另外,从本周开始,周六计划单独去公司加班学习。看执行力吧。晚安。


 

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值