zoukankan      html  css  js  c++  java
  • Android中使用ShareSDK集成分享功能

    引言

         现在APP开发集成分享功能已经是非常普遍的需求了。其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑。好了,下面切入正题正式开始介绍。

    1、ShareSDK开发包及配置

         这个不用多说,去他们官网看找SDK开发包和集成文档即可。Android版本地址:http://www.mob.com/downloadDetail/ShareSDK/android。注意:记得要注册ShareSDK账号获取AppKey哦。这些集成文档里面应该都有,仔细看即可。

    2、去各大应用平台注册获取AppKey和AppSecret

         这个步骤要看你们团队想分享到哪些平台了,一般都是微博和微信。所以一般都去新浪微博和微信开发平台注册。

         新浪开发平台:http://open.weibo.com/

         腾讯开放平台:https://open.weixin.qq.com/

    3、一键分享功能的集成

         使用ShareSDK进行分享,如果你不需要进行定制开发的话,就可以使用ShareSDK里面自带的一键分享模块。使用之前别忘记把ShareSDK中的jar包和ShareSDK.xml放到指定位置哦(配置文档里面都有,慢慢看即可)。

         在application节点下注册下面的Activity如图所示:

        

       注意:将红框部分的数字改成在腾讯开放平台申请到的AppId即可。

         如果项目集成了微信,还需要添加以下WXEntryActivity,不然的话,mob后台无法做微信的分享统计:(在工程的包下新建wxapi目录再放置WXEntryActivity)

    1 <!-- 微信分享配置 -->
    2         <activity
    3             android:name=".wxapi.WXEntryActivity"
    4             android:configChanges="keyboardHidden|orientation|screenSize"
    5             android:exported="true"
    6             android:screenOrientation="portrait"
    7             android:theme="@android:style/Theme.Translucent.NoTitleBar" />

      WXEntryActivity.java代码如下:

     1 /*
     2  * 官网地站:http://www.mob.com
     3  * 技术支持QQ: 4006852216
     4  * 官方微信:ShareSDK   (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
     5  *
     6  * Copyright (c) 2013年 mob.com. All rights reserved.
     7  */
     8 
     9 package com.example.haoyunhl.controller.wxapi;
    10 
    11 import android.content.Intent;
    12 import android.widget.Toast;
    13 import cn.sharesdk.wechat.utils.WXAppExtendObject;
    14 import cn.sharesdk.wechat.utils.WXMediaMessage;
    15 import cn.sharesdk.wechat.utils.WechatHandlerActivity;
    16 
    17 /** 微信客户端回调activity示例 */
    18 public class WXEntryActivity extends WechatHandlerActivity {
    19 
    20     /**
    21      * 处理微信发出的向第三方应用请求app message
    22      * <p>
    23      * 在微信客户端中的聊天页面有“添加工具”,可以将本应用的图标添加到其中
    24      * 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可
    25      * 做点其他的事情,包括根本不打开任何页面
    26      */
    27     public void onGetMessageFromWXReq(WXMediaMessage msg) {
    28         if (msg != null) {
    29             Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
    30             startActivity(iLaunchMyself);
    31         }
    32     }
    33 
    34     /**
    35      * 处理微信向第三方应用发起的消息
    36      * <p>
    37      * 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享
    38      * 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信
    39      * 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作
    40      * 回调。
    41      * <p>
    42      * 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast
    43      */
    44     public void onShowMessageFromWXReq(WXMediaMessage msg) {
    45         if (msg != null && msg.mediaObject != null
    46                 && (msg.mediaObject instanceof WXAppExtendObject)) {
    47             WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
    48             Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
    49         }
    50     }
    51 
    52 }

         下面你就可以调用一键分享功能进行简单的分享了,记住在调用之前一点要先调用ShareSDK.initSDK(this)这个方法。

          说明:一键分享虽然简单,但是如果想要对一键分享界面进行修改时比较麻烦的,听说现在版本修改界面好像方便很多了?(不清楚,兄弟你可以去集成文档瞧瞧)。下面我就来介绍自定义的分享界面。

    4、自定义分享界面的开发

          先看效果图:

         

          下面就来详细介绍这个分享界面的开发

           界面样式的布局相信大家应该都很熟悉了,我这里就不贴样式布局的代码了。我在开发中将分享功能集成到了一个组件中(ShareDialog)。详细代码如下:

      1 package com.mobile.develop.framework.dialog;
      2 
      3 import android.app.Dialog;
      4 import android.content.Context;
      5 import android.content.DialogInterface.*;
      6 import android.view.Display;
      7 import android.view.Gravity;
      8 import android.view.LayoutInflater;
      9 import android.view.View;
     10 import android.view.Window;
     11 import android.view.WindowManager;
     12 import android.widget.LinearLayout;
     13 import android.widget.TextView;
     14 import com.example.haoyunhl.controller.R;
     15 
     16 public class ShareDialog {
     17     private Dialog mDialog;
     18     //取消分享
     19     private TextView txtCancle;
     20     private OnClickListener mOnCancleListener;
     21     //微信分享
     22     private LinearLayout mWeChatShare;
     23     private OnClickListener mOnWeChatShareListener;
     24     //微信朋友圈分享
     25     private LinearLayout mWeChatFriendShare;
     26     private OnClickListener mOnWeChatFriendShareListener;
     27     //QQ分享
     28     private LinearLayout mQQShare;
     29     private OnClickListener mOnQQShareListener;
     30     private Context mContext;
     31     private Display display;
     32 
     33     public ShareDialog(Context context){
     34         mContext=context;
     35         //获取屏幕对象
     36         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
     37         display = windowManager.getDefaultDisplay();
     38     }
     39 
     40     //设置微信分享
     41     public ShareDialog setOnWeChatShare(OnClickListener weChatShareListener){
     42         mOnWeChatShareListener=weChatShareListener;
     43         return this;
     44     }
     45 
     46     //设置分享朋友圈
     47     public ShareDialog setOnWeChatFriendShare(OnClickListener weChatFriendShareListener){
     48         mOnWeChatFriendShareListener=weChatFriendShareListener;
     49         return this;
     50     }
     51 
     52     //QQ分享
     53     public ShareDialog setOnQQShare(OnClickListener qqShareListener){
     54         mOnQQShareListener=qqShareListener;
     55         return this;
     56     }
     57 
     58     public ShareDialog setOnCancleListener(OnClickListener cancleListener){
     59         mOnCancleListener=cancleListener;
     60         return this;
     61     }
     62 
     63     public void show(){
     64         mDialog.show();
     65     }
     66 
     67     public void dismiss(){
     68         mDialog.dismiss();
     69     }
     70 
     71     /**
     72      * 创建BaseDialog实例
     73      * @return
     74      */
     75     public ShareDialog builder(){
     76         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     77         View view = inflater.inflate(R.layout.share_dialg_style, null);
     78         //设置弹出框横向铺满整个屏幕
     79         view.setMinimumWidth(display.getWidth());
     80         mDialog = new Dialog(mContext, R.style.ActionSheetDialogStyle);
     81         //设置dialog弹出后会点击屏幕,dialog不消失;点击物理返回键dialog消失
     82         mDialog.setCanceledOnTouchOutside(true);
     83         Window dialogWindow = mDialog.getWindow();
     84         dialogWindow.setGravity(Gravity.CENTER | Gravity.BOTTOM);
     85         WindowManager.LayoutParams lp = dialogWindow.getAttributes();
     86         lp.x = 0;
     87         lp.y = 0;
     88         dialogWindow.setAttributes(lp);
     89         //设置点击隐藏
     90         txtCancle=(TextView)view.findViewById(R.id.txtCancle);
     91         txtCancle.setOnClickListener(new View.OnClickListener() {
     92             @Override
     93             public void onClick(View v) {
     94                 if (mOnCancleListener != null) {
     95                     mOnCancleListener.onClick(mDialog, Dialog.BUTTON_NEGATIVE);
     96                 }
     97                 dismiss();
     98             }
     99         });
    100         //微信分享
    101         mWeChatShare=(LinearLayout)view.findViewById(R.id.mWeChatShare);
    102         mWeChatShare.setOnClickListener(new View.OnClickListener() {
    103             @Override
    104             public void onClick(View v) {
    105                 if (mOnWeChatShareListener != null) {
    106                     mOnWeChatShareListener.onClick(mDialog, Dialog.BUTTON_POSITIVE);
    107                 }
    108                 dismiss();
    109             }
    110         });
    111         //朋友圈分享
    112         mWeChatFriendShare=(LinearLayout)view.findViewById(R.id.mWeChatFriendShare);
    113         mWeChatFriendShare.setOnClickListener(new View.OnClickListener() {
    114             @Override
    115             public void onClick(View v) {
    116                 if(mOnWeChatFriendShareListener!=null) {
    117                     mOnWeChatFriendShareListener.onClick(mDialog, Dialog.BUTTON_POSITIVE);
    118                 }
    119                 dismiss();
    120             }
    121         });
    122         //QQ分享
    123         mQQShare=(LinearLayout)view.findViewById(R.id.mQQShare);
    124         mQQShare.setOnClickListener(new View.OnClickListener() {
    125             @Override
    126             public void onClick(View v) {
    127                 if(mOnQQShareListener!=null){
    128                     mOnQQShareListener.onClick(mDialog,Dialog.BUTTON_POSITIVE);
    129                 }
    130             }
    131         });
    132         mDialog.setContentView(view);
    133         return this;
    134     }
    135 }

      我们自定义分享时只需要重写SharePlatform.java即可。在这个文件中通过不同的分支,来执行不同的分享逻辑。代码如下:

      1 package com.example.haoyunhl.utils;
      2 
      3 import android.app.Activity;
      4 import android.content.Context;
      5 import android.os.Handler;
      6 import android.os.Message;
      7 import android.widget.Toast;
      8 import java.util.HashMap;
      9 import cn.sharesdk.framework.Platform;
     10 import cn.sharesdk.framework.PlatformActionListener;
     11 import cn.sharesdk.framework.ShareSDK;
     12 import cn.sharesdk.tencent.qq.QQ;
     13 import cn.sharesdk.wechat.friends.Wechat;
     14 import cn.sharesdk.wechat.moments.WechatMoments;
     15 
     16 public class SharePlatform extends Activity implements PlatformActionListener {
     17 
     18     private Context context;
     19 
     20     public SharePlatform(Context context){
     21         this.context=context;
     22         ShareSDK.initSDK(this.context);
     23     }
     24 
     25     /**
     26      * 分享回调
     27      */
     28     @Override
     29     public void onCancel(Platform arg0, int arg1) {
     30         //回调的地方是子线程,进行UI操作要用handle处理
     31         handler.sendEmptyMessage(4);
     32     }
     33 
     34     @Override
     35     public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
     36         //回调的地方是子线程,进行UI操作要用handle处理
     37         if (arg0.getName().equals(Wechat.NAME)) {
     38             handler.sendEmptyMessage(1);
     39         } else if (arg0.getName().equals(WechatMoments.NAME)) {
     40             handler.sendEmptyMessage(2);
     41         } else if (arg0.getName().equals(QQ.NAME)) {
     42             handler.sendEmptyMessage(3);
     43         }
     44     }
     45 
     46     @Override
     47     public void onError(Platform arg0, int arg1, Throwable arg2) {
     48         //回调的地方是子线程,进行UI操作要用handle处理
     49         arg2.printStackTrace();
     50         Message msg = new Message();
     51         msg.what = 5;
     52         msg.obj = arg2.getMessage();
     53         handler.sendMessage(msg);
     54     }
     55 
     56     Handler handler = new Handler() {
     57         @Override
     58         public void handleMessage(Message msg) {
     59             switch (msg.what) {
     60                 case 1:
     61                     Toast.makeText(context, "微信分享成功", Toast.LENGTH_LONG).show();
     62                     break;
     63                 case 2:
     64                     Toast.makeText(context, "朋友圈分享成功", Toast.LENGTH_LONG).show();
     65                     break;
     66                 case 3:
     67                     Toast.makeText(context, "QQ分享成功", Toast.LENGTH_LONG).show();
     68                     break;
     69                 case 4:
     70                     Toast.makeText(context, "取消分享", Toast.LENGTH_LONG).show();
     71                     break;
     72                 case 5:
     73                     Toast.makeText(context, "分享失败", Toast.LENGTH_LONG).show();
     74                     break;
     75                 default:
     76                     break;
     77             }
     78         }
     79     };
     80 
     81 
     82     /**
     83      * 进行分享
     84      *
     85      * @param shareType
     86      * @param shareTitle
     87      * @param shareText
     88      * @param shareImageUrl
     89      * @param shareUrl
     90      */
     91     public void share(String shareType, String shareTitle, String shareText, String shareImageUrl, String shareUrl) {
     92         Platform.ShareParams sharePlatform = new Platform.ShareParams();
     93         Platform platform;
     94         /**
     95          * 如果是微信朋友圈分享
     96          */
     97         if(shareType.equalsIgnoreCase(ShareConfig.WeChatMomentsShare)){
     98             sharePlatform.setShareType(Platform.SHARE_WEBPAGE);
     99 
    100             setSharePlatform(sharePlatform,shareTitle, shareText, shareImageUrl);
    101 
    102             if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) {
    103                 sharePlatform.setUrl(shareUrl);
    104             }
    105 
    106             platform = ShareSDK.getPlatform(WechatMoments.NAME);
    107             platform.setPlatformActionListener(this);
    108             platform.share(sharePlatform);
    109         }
    110         /**
    111          * 如果是微信分享
    112          */
    113         else if(shareType.equalsIgnoreCase(ShareConfig.WeChatShare)){
    114             sharePlatform.setShareType(Platform.SHARE_WEBPAGE);
    115 
    116             setSharePlatform(sharePlatform, shareTitle, shareText, shareImageUrl);
    117 
    118             if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) {
    119                 sharePlatform.setUrl(shareUrl);
    120             }
    121             platform = ShareSDK.getPlatform(Wechat.NAME);
    122             platform.setPlatformActionListener(this);
    123             platform.share(sharePlatform);
    124         }
    125         /**
    126          * 如果是QQ分享
    127          */
    128         else {
    129             setSharePlatform(sharePlatform, shareTitle, shareText, shareImageUrl);
    130 
    131             if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) {
    132                 sharePlatform.setTitleUrl(shareUrl);
    133             }
    134 
    135             platform = ShareSDK.getPlatform(QQ.NAME);
    136             platform.setPlatformActionListener(this);
    137             platform.share(sharePlatform);
    138         }
    139     }
    140 
    141 
    142     private void setSharePlatform(Platform.ShareParams sharePlatform,String shareTitle, String shareText, String shareImageUrl){
    143         sharePlatform.setTitle(shareTitle);
    144         if(shareText!=null && !shareText.equalsIgnoreCase("")) {
    145             sharePlatform.setText(shareText);
    146         }
    147         if(shareImageUrl!=null && !shareImageUrl.equalsIgnoreCase("")) {
    148             sharePlatform.setImageUrl(shareImageUrl);
    149             sharePlatform.setImagePath(shareImageUrl);
    150         }
    151     }
    152 }

      我们在导航栏中只需要如此调用即可实现分享功能:

     

  • 相关阅读:
    白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)
    白盒测试--基本路径测试法详细说明和举例
    测试用例编写规范
    EF数据库连接时候出错
    元祖,字典,列表及其内置方法
    字符串、列表练习’
    数字,字符串,列表及其内置方法
    流程控制代码练习
    易出错知识点
    流程控制if、while、for
  • 原文地址:https://www.cnblogs.com/dreamGong/p/6164879.html
Copyright © 2011-2022 走看看