第一步:下载SDK:
- 1下载地址:http://www.mob.com/#/downloadDetail/ShareSDK/android
- 根据需求选择需要的平台:
第二步:申请ShareSDK的AppKey
- 把鼠标移到头像上,点击进入后台:
- 点击ShareSDK:
- 把鼠标移到应用上,点击添加应用:
- 根据自己的需求填写:
- 这样就得到了ShareSDK的AppKey:
第三步:快速集成
进入ShareSDK解压目录,打开“Share SDK for Android”目录,可以找到“QuickIntegrater.jar”,这个就是快速集成ShareSDK的工具。
Windows下:
首先确定您已经安装了JDK,并且正确配置了JAVA_HOME和PATH系统变量,此时您可以双击QuickIntegrater启动程序。
然后复制此文件夹中所有文件到自己的项目中覆盖。
Linux/Mac OS下:
同样需要先确保已经正确配置了JDK,之后启动终端,cd进入“Share SDK for Android”目录,输入: java -jar QuickIntegrater.jar 可启动QuickIntegrater
第四步:配置AndroidManifest.xml
- 1.添加权限:
下面清单文件的配置是全部的,没有的平台就是不需要配置。
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- 蓝牙分享所需的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- 2.添加activity信息
**注意:**tencent后面的appid要保持和自己配置的QQ的appid一致。
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- 调用新浪原生SDK,需要注册的回调activity -->
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
- 3.如果集成了微信,易信,支付宝还需要添加下面回调的activity处理.
注意:这些avtivity的name。
<!-- 微信分享回调 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
<!--易信分享回调 -->
<activity
android:name=".yxapi.YXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
<!-- 支付宝分享回调 -->
<activity
android:name=".apshare.ShareEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"/>
4.替换mob后台申请的Appkey与各个平台申请的key。
5.添加一键分享代码
private void showShare() {
ShareSDK.initSDK(this);
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// 分享时Notification的图标和文字 2.5.9以后的版本不调用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle(getString(R.string.share));
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl("http://sharesdk.cn");
// text是分享文本,所有平台都需要这个字段
oks.setText("我是分享文本");
//分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
//oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://sharesdk.cn");
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("我是测试评论文本");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("http://sharesdk.cn");
// 启动分享GUI
oks.show(this);
}
自定义UI,实现不同平台分享内容差异化
功能说明:点击分享,弹出自定义对话框;根据传入的参数,选择要调起的平台,不同平台分享不同内容。
- 1.dialog的布局(dialog_share.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff" >
<GridView
android:id="@+id/dialog_share_gridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:numColumns="auto_fit"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp"
android:background="#00000000"></GridView>
</RelativeLayout>
- 2.item的布局文件(dialog_share_item.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp" >
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="文字"
android:textColor="#000000" />
</LinearLayout>
- 3.shareUtils代码(ShareUtils.java)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.chinalife.gstc.R;
import com.chinalife.gstc.common.data.Const;
import com.mob.tools.utils.UIHandler;
import android.app.Dialog;
import android.content.Context;
import android.os.Handler.Callback;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.onekeyshare.OnekeyShare;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.system.text.ShortMessage;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.tencent.qq.QQ.ShareParams;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments;
public class ShareUtils {
// 图片封装为一个数组
private static int[] icon = { R.drawable.ssdk_oks_classic_qq,
R.drawable.ssdk_oks_classic_qzone,
R.drawable.ssdk_oks_classic_wechat,
R.drawable.ssdk_oks_classic_wechatmoments,
R.drawable.ssdk_oks_classic_sinaweibo,
R.drawable.ssdk_oks_classic_shortmessage };
private static String[] iconName = { "QQ", "QQ空间", "微信", "微信朋友圈", "新浪微博",
"短消息" };
private static int[] platform = { 1, 2, 3, 4, 5, 6 };
private static List<Map<String, Object>> data_list = null;
private static SimpleAdapter sim_adapter;
private static final int MSG_ACTION_CCALLBACK = 2;
private static Context mContext;
/**
* 自定义分享功能
*
* @param context
* @param share要调起的平台
* (1-QQ, 2-QQ空间, 3-微信, 4-微信朋友圈, 5-新浪微博, 6-短消息)
* @param title标题
* @param text分享的文本
* @param imageUrl分享的图片网址url
* @param url可点的连接地址url
*/
public static void showShare(Context context, int[] share,
final String title, final String text, final String imageUrl,
final String url) {
mContext = context;
ShareSDK.initSDK(context);
final Dialog dialog = new Dialog(context, R.style.Theme_Transparent);
dialog.setContentView(R.layout.dialog_share);
dialog.show();
GridView gridView = (GridView) dialog
.findViewById(R.id.dialog_share_gridview);
// 新建List
data_list = new ArrayList<Map<String, Object>>();
// 获取数据
getData(share);
// 新建适配器
String[] from = { "image", "text" };
int[] to = { R.id.image, R.id.text };
sim_adapter = new SimpleAdapter(context, data_list,
R.layout.dialog_share_item, from, to);
// 配置适配器
gridView.setAdapter(sim_adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ShareParams shareParams = new ShareParams();
// 标题
if(!TextUtils.isEmpty(title)){
shareParams.setTitle(title);
}
// 文本
if(!TextUtils.isEmpty(text)){
shareParams.setText(text);
}
// 分享网络图片
if(!TextUtils.isEmpty(imageUrl)){
shareParams.setImageUrl(imageUrl);
}
// 可点的连接地址ur
if(!TextUtils.isEmpty(url)){
shareParams.setUrl(url);
}
// 执行图文分享
shareParams.setShareType(Platform.SHARE_WEBPAGE);
if ("QQ".equals(data_list.get(position).get("text"))) {
Platform platQQ = ShareSDK.getPlatform(QQ.NAME);
platQQ.setPlatformActionListener(listener);
platQQ.share(shareParams);
} else if ("QQ空间".equals(data_list.get(position).get("text"))) {
Platform platQZone = ShareSDK.getPlatform(QZone.NAME);
platQZone.setPlatformActionListener(listener);
platQZone.share(shareParams);
} else if ("微信".equals(data_list.get(position).get("text"))) {
Platform platWechat = ShareSDK.getPlatform(Wechat.NAME);
platWechat.setPlatformActionListener(listener);
platWechat.share(shareParams);
} else if ("微信朋友圈".equals(data_list.get(position).get("text"))) {
Platform platWechatMoments = ShareSDK
.getPlatform(WechatMoments.NAME);
platWechatMoments.setPlatformActionListener(listener);
platWechatMoments.share(shareParams);
} else if ("新浪微博".equals(data_list.get(position).get("text"))) {
Platform platSinaWeibo = ShareSDK
.getPlatform(SinaWeibo.NAME);
platSinaWeibo.setPlatformActionListener(listener);
platSinaWeibo.share(shareParams);
} else if ("短消息".equals(data_list.get(position).get("text"))) {
shareParams.setShareType(Platform.SHARE_TEXT);
Platform platShortMessage = ShareSDK
.getPlatform(ShortMessage.NAME);
platShortMessage.share(shareParams);
}
dialog.dismiss();
}
});
}
/**
*
* @param platform要分享的平台
*/
private static List<Map<String, Object>> getData(int[] share) {
data_list.clear();
int num;
for (int i = 0; i < share.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
if (share[i] == 0) {
break;
}
num = share[i] - 1;
map.put("image", icon[num]);
map.put("text", iconName[num]);
map.put("platform", platform[num]);
data_list.add(map);
}
return data_list;
}
static PlatformActionListener listener = new PlatformActionListener() {
@Override
public void onError(Platform platform, int action, Throwable t) {
// 失敗
// 打印错误信息,print the error msg
t.printStackTrace();
// 错误监听,handle the error msg
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 2;
msg.arg2 = action;
msg.obj = t;
UIHandler.sendMessage(msg,mCallback);
}
@Override
public void onComplete(Platform platform, int action,
HashMap<String, Object> arg2) {
// 成功
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 1;
msg.arg2 = action;//这个是代表操作的类型,9代表是分享8代表操作是获取用户资料
msg.obj = platform;//这个参数就是进行操作的平台对象啦
UIHandler.sendMessage(msg,mCallback);
}
@Override
public void onCancel(Platform platform, int action) {
// 取消
Message msg = new Message();
msg.what = MSG_ACTION_CCALLBACK;
msg.arg1 = 3;
msg.arg2 = action;
msg.obj = platform;
UIHandler.sendMessage(msg,mCallback);
}
};
static Callback mCallback = new Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.arg1) {
// 成功
case 1:
Toast.makeText(mContext, "分享成功", 10000).show();
break;
// 失败
case 2:
Toast.makeText(mContext, "分享失败", 10000).show();
break;
// 取消
case 3:
//Toast.makeText(mContext, "分享取消", 10000).show();
break;
}
return false;
}
};
}
注意:
- 1.传入的参数根据需求自行增减,shareParams不同平台的差异化参数设置写在if判断里,就实现不同平台分享内容差异化。
- 2.微信平台必须设置shareParams.setShareType(*);
不同平台分享参数说明
注意:
- 1.没有标明可选的就是必填参数,不能为null或者空字符串。
- 2.imageUrl、imagePath、imageData为三选一。
新浪微博
新浪微博支持分享文字、本地图片、网络图片和经纬度信息。
新浪微博使用客户端分享不会正确回调
参数说明:
text:小于2000字
image:图片最大5M,仅支持JPEG、GIF、PNG格式
latitude:有效范围:-90.0到+90.0,+表示北纬
longitude:有效范围:-180.0到+180.0,+表示东经
注:微博分享链接是将链接写到setText内:eg:setText(“分享文本 http://mob.com”);
分享文本:
- text
分享图文:
- text imagePath
- text imageUrl
注:如果imagePath和imageUrl同时存在,imageUrl将被忽略。
腾讯微博
腾讯微博支持分享文字、本地图片、网络图片和经纬度信息。
参数说明:
text:最多140个字字符
image:图片最大4M
分享文本:
- text latitude(可选) longitude(可选)
分享图文:
- text imagePath latitude(可选) longitude(可选)
- text imageUrl latitude(可选) longitude(可选)
- text ImageArray latitude(可选) longitude(可选)
2.5.0以后的版本新增分享多张图片的功能ImageArray。 由于腾讯微博分享网络图片并不属于高级接口,因此imageUrl优先级高于imagePath,这就是说,如果imagePath和imageUrl同时存在,imagePath将被忽略。
QQ空间
QQ空间支持分享文字和图文。
参数说明:
title:最多200个字符
text:最多600个字符
分享文本:
- title titleUrl text site siteUrl
发表说说:
- text imagePath site siteUrl
- text imageUrl site siteUrl
分享图文:
- title titleUrl text imagePath site siteUrl
- title titleUrl text imageUrl site siteUrl
QQ空间分享时一定要携带title、titleUrl、site、siteUrl,QQ空间本身不支持分享本地图片,因此如果想分享本地图片,图片会先上传到ShareSDK的文件服务器,得到连接以后才分享此链接。由于本地图片更耗流量,因此imageUrl优先级高于imagePath。 site是分享此内容的网站名称,仅在QQ空间使用;siteUrl是分享此内容的网站地址,仅在QQ空间使用;
微信(好友、朋友圈、收藏)
绕过审核只对微信好友、微信朋友圈有效。
微信分享如果是绕过审核(配置信息BypassApproval属性设置为true为绕过审核),微信朋友圈可以分享单张图片或者图片与文字一起分享,微信好友可以进行文字或者单张图片或者文件进行分享,分享回调不会正确回调。
不绕过审核,微信三个平台中,好友的功能最完整,朋友圈不能分享表情、文件和应用,收藏不能分享表情和应用。表格下以好友为例子:
参数说明:
title:512Bytes以内
text:1KB以内
imageData:10M以内
imagePath:10M以内(传递的imagePath路径不能超过10KB)
imageUrl:10KB以内
musicUrl:10KB以内
url:10KB以内
分享文本:
- shareType(Platform.SHARE_TEXT) title text
分享图片:
- shareType(Platform.SHARE_IMAGE) title text(设置了不会显示,可选参数) imagePath
- shareType(Platform.SHARE_IMAGE) title text(设置了不会显示,可选参数) imageUrl
- shareType(Platform.SHARE_IMAGE) title text(设置了不会显示,可选参数) imageData
分享音乐:
- shareType(Platform.SHARE_MUSIC) title text(朋友圈不显示此字段) imagePath musicUrl url(消息点击后打开的页面)
- shareType(Platform.SHARE_MUSIC) title text(朋友圈不显示此字段) imageUrl musicUrl url(消息点击后打开的页面)
- shareType(Platform.SHARE_MUSIC) title text(朋友圈不显示此字段) imageData musicUrl url(消息点击后打开的页面)
分享视频:
- shareType(Platform.SHARE_VIDEO) title text(朋友圈不显示此字段) imagePath url(视频网页地址)
- shareType(Platform.SHARE_VIDEO) title text(朋友圈不显示此字段) imageUrl url(视频网页地址
- shareType(Platform.SHARE_VIDEO) title text(朋友圈不显示此字段) imageData url(视频网页地址
分享网页:
- shareType(Platform.SHARE_WEBPAGE) title text(朋友圈不显示此字段) imagePath url
-shareType(Platform.SHARE_WEBPAGE) title text(朋友圈不显示此字段) imageUrl url
-shareType(Platform.SHARE_WEBPAGE) title text(朋友圈不显示此字段) imageData url
分享应用:
- shareType(Platform.SHARE_APPS) title text(朋友圈不显示此字段) imagePath filePath(apk文件) extInfo(应用信息脚本)
- shareType(Platform.SHARE_APPS) title text(朋友圈不显示此字段) imageUrl filePath(apk文件) extInfo(应用信息脚本)
- shareType(Platform.SHARE_APPS) title text(朋友圈不显示此字段) imageData filePath(apk文件) extInfo(应用信息脚本)
分享文件:
- shareType(Platform.SHARE_FILE) title text(朋友圈不显示此字段) imagePath filePath
- shareType(Platform.SHARE_FILE) title text(朋友圈不显示此字段) imageUrl filePath
- shareType(Platform.SHARE_FILE) title text(朋友圈不显示此字段) imageData filePath
分享表情:
- shareType(Platform.SHARE_EMOJI) title text(朋友圈不显示此字段) imagePath
- shareType(Platform.SHARE_EMOJI) title text(朋友圈不显示此字段) imageUrl
- shareType(Platform.SHARE_EMOJI) title text(朋友圈不显示此字段) imageData
微信并无实际的分享网络图片和分享bitmap的功能,如果设置了网络图片,此图片会先下载会本地,之后再当作本地图片分享,因此延迟较大。bitmap则好一些,但是由于bitmap并不知道图片的格式,因此都会被当作png编码,再提交微信客户端。此外,SHARE_EMOJI支持gif文件,但是如果使用imageData,则默认只是提交一个png图片,因为bitmap是静态图片。
QQ分享
QQ分享支持图文和音乐分享。
参数说明:
title:最多30个字符
text:最多40个字符
分享图片:
- ImageUrl
- imagePath
分享链接:
- title titleUrl text imagePath
- title titleUrl text imageUrl
分享音频:
- title titleUrl text imagePath musicUrl
- title titleUrl text imageUrl musicUrl
QQ分享图文和音乐,在PC版本的QQ上可能只看到一条连接,因为PC版本的QQ只会对其白名单的连接作截图,如果不在此名单中,则只是显示连接而已. 如果只分享图片在PC端看不到图片的,只会显示null,在手机端会显示图片和null字段。
信息
信息分短信和彩信,如果设置了标题或者图片,会直接当作彩信发送。发送信息的时候使用手机的信息软件
分享文本:
- address title text
分享图文:
- address title text imagePath imageUrl
支付宝
分享文本:
- shareType(SHARE_TEXT) title text
分享图片:
- shareType(SHARE_IMAGE) title text imagePath
- shareType(SHARE_IMAGE) title text imageUrl
- shareType(SHARE_IMAGE) title text imageData
分享网页:
- shareType(SHARE_WEBPAGE) title text imagePath url(消息点击后打开的页面)
- shareType(SHARE_WEBPAGE) title text imageUrl url(消息点击后打开的页面)
- shareType(SHARE_WEBPAGE) title text imageData url(消息点击后打开的页面)