项目的Demo:
https://download.csdn.net/download/tanghongchang123/9475557
申请ShareSDK的appkey的流程
ShareSDK深受大家喜爱,看下亲爱的用户做的详细说明:Studio集成
进入ShareSDK解压目录,打开“Share SDK for Android”目录,可以找到“QuickIntegrater.jar”,这个就是快速集成ShareSDK的工具
首先确定您已经安装了JDK,并且正确配置了JAVA_HOME和PATH系统变量,此时您可以双击QuickIntegrater启动程序
同样需要先确保已经正确配置了JDK,之后启动终端,cd进入“Share SDK for Android”目录,输入: java -jar QuickIntegrater.jar 可启动QuickIntegrater
正确输入项目的名称和包名,勾选需要的集成的平台,然后点击“确定”。
QuickIntegrater会自行产生一个文件夹,复制此文件夹中所有文件到您的项目中覆盖即可。
下面清单文件的配置是全部的,没有的平台就是不需要配置
1
2
3
4
5
6
7
8
9
10
11
12
|
<
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"
/
>
|
(注意: tencent后面的appid要保持和您配置的QQ的appid一致)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<
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
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<
!
--微信分享回调
--
>
<
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"
/
>
|
在您的代码中调用此方法,即可打开一键分享功能进行分享
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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
(
"我是分享文本"
)
;
// 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
)
;
}
|
运行效果如下:
编译并运行后,弹出类似上图的分享列表选择页面,点击后弹出分享窗口,点击发表后就成功发送到社交平台的话说明你已经基本集成成功了。
API文档
如果上述文档不能满足你的分享需求,请参看高级自定义功能。
ShareSDK的授权分为“手动授权”和“自动授权”。前者是指显式调用ShareSDK的授权代码来执行授权操作,后者是执行ShareSDK的操作前不考虑具体平台是否已经完成授权操作,直接调用其对应方法执行操作(如分享操作),ShareSDK内部会根据平台数据库中的数据判断其是否已经完成授权,若是未授权或授权信息已经失效,则自行启动授权流程,执行授权。自动授权于开发者是透明的,但是于用户来说依然存在。
不管您选择的是“手动授权”还是“自动授权”,授权都是您接触ShareSDK的第一个操作。
对于大部分的应用来说,手动授权是没有必要的,但是如果您只是想做一个“账号系统”,或者是说您的应用不需要注册,只需要是微博的用户,就能登录,那么这个方法还是十分有用途的。
下面是新浪微博授权操作的例子:
1
2
3
4
5
|
Platform
weibo
=
ShareSDK
.
getPlatform
(
SinaWeibo
.
NAME
)
;
weibo
.
setPlatformActionListener
(
paListener
)
;
weibo
.
authorize
(
)
;
//移除授权
//weibo.removeAccount(true);
|
调用authorize方法,会弹出一个基于ShareSDKUIShell的授权页面,填写账号和密码以后,会执行授权操作。这个方法的操作回调paListener并不实际带回什么数据,只是通过回调告知外部成功或者失败。但是每一个平台都具备一个PlatformDb的成员,这里面存储了此平台的授权信息。可以参考如下章节7的平台数据库的操作的说明或查看获取授权用户资料章节,通过方法getToken、getUserId等方法,获取授权用户在此平台上的授权信息。并由此建立“账户系统”。
以上是授权新浪微博的例子,如果想授权其他的第三方平台,只需要通过修改平台的名称。
1
|
Platform
qq
=
ShareSDK
.
getPlatform
(
QQ
.
NAME
)
;
|
平台的名称可以在assets下shareSDK.xml文件里面对应获取找到。如下所示:SinaWeibo、QZone等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<
ShareSDK
AppKey
=
"androidv1101"
/
>
<
!
--
修改成你在
sharesdk后台注册的应用的
appkey
"-->
Id="
1
"
SortId="
1
"
AppKey="
568898243
"
AppSecret="
38a4f8204cc784f81f9f0daaf31e02e3
"
RedirectUrl="
http
:
//www.sharesdk.cn"
ShareByAppClient
=
"false"
Enable
=
"true"
/
>
<
TencentWeibo
Id
=
"2"
SortId
=
"2"
AppKey
=
"801307650"
AppSecret
=
"ae36f4ee3946e1cbb98d6965b0b2ff5c"
RedirectUri
=
"http://sharesdk.cn"
Enable
=
"true"
/
>
<
!
--
ShareByAppClient标识是否使用微博客户端分享,默认是
false
--
>
<
QZone
Id
=
"3"
SortId
=
"3"
AppId
=
"100371282"
AppKey
=
"aed9b0303e3ed1e27bae87c33761161d"
ShareByAppClient
=
"true"
Enable
=
"true"
/
>
|
自动授权就是直接无视授权操作而调用其他的操作(如关注或者分享)。在自动授权下,授权操作对开发者而言是透明的,它由ShareSDK内部控制,开发者没有调用授权的代码,也没有办法接收到授权的结果。比方说如果开发者执行关注,则发起时调用的方法是关注,操作回调中得到的结果(不管成败)也是关注。
关于这些操作的例子,可以参考其对应的章节。
SSO授权方式,简单来说就是使用目标平台客户端来完成授权。
1
2
3
4
|
Platform
weibo
=
ShareSDK
.
getPlatform
(
SinaWeibo
.
NAME
)
;
weibo
.
SSOSetting
(
false
)
;
//设置false表示使用SSO授权方式
weibo
.
setPlatformActionListener
(
this
)
;
// 设置分享事件回调
weibo
.
authorize
(
)
;
|
使用了SSO授权后,有客户端的都会优先启用客户端授权,没客户端的则任然使用网页版进行授权。
这里需要注意的是新浪微博客户端授权是需要用户在开发者平台(网址:http://open.weibo.com)申请的应用用过了新浪的审核。而且要通过keystore进行签名打包测试。注意打包所用的keystore上的md5签名、项目的包名要与新浪开发者平台上填写的签名与包名一致。对比方式如图:
平台截图:
项目包名:
keystore的md5签名:
本节介绍的是如何自定义“Web授权页面”,由于SSO授权方式使用的是目标平台的客户端,ShareSDK无法修改其页面,因此不在介绍范围之内。
ShareSDK的所有GUI都基于ShareSDKUIShell,但是ShareSDKUIShell只是一个容器,真正显示授权页面主体和逻辑是几个FakeActivity的子类。这些控件在ShareSDK之外是不能修改的,但是考虑到很多开发者希望可以修改这个页面的布局、逻辑等等代码,因此ShareSDK为此提供了一个自定义授权页面的方法,操作如下:
1)打开AndroidManifest.xml,并如下修改ShareSDKUIShell的注册信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
activity
android
:
name
=
"com.mob.tools.MobUIShell"
android
:
theme
=
"@android:style/Theme.Translucent.NoTitleBar"
android
:
configChanges
=
"keyboardHidden|orientation"
android
:
screenOrientation
=
"portrait"
android
:
windowSoftInputMode
=
"stateHidden|adjustResize"
>
<
!
--
AuthorizeAdapter继承自
cn
.
sharesdk
.
framework
.
authorize
.
AuthorizeAdapter,
可以监听到页面的生命周期,也能获取页面的各种
UI控件。
开发者可以通过继承
AuthorizeAdapter,重写其方法,
并获取各种
UI来自定义这个页面的行为。
--
>
<
meta
-
data
android
:
name
=
"AuthorizeAdapter"
android
:
value
=
"cn.sharesdk.demo.MyAdapter"
/
>
<
/
activity
>
|
其中的cn.sharesdk.demo.MyAdapter是一个继承自cn.sharesdk.framework.authorize.AuthorizeAdapter的类。开发者可以根据自己的需要,修改Adapter为任何类名和路径,但是一定要继承自AuthorizeAdapter。当然,如果您不想修改授权页面,可以不设置这个Adapter。
2)创建MyAdapter这个类,然后添加自定义代码,如(修改授权页面标题栏的文字):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
MyAdapter
extends
AuthorizeAdapter
{
public
void
onCreate
(
)
{
System
.
out
.
println
(
"> ShareSDKUIShell created!"
)
;
//获取标题栏控件
TitleLayout
llTitle
=
getTitleLayout
(
)
;
//标题栏的文字修改
int
resID
=
getStringRes
(
getActivity
(
)
,
"second_title"
)
;
//这个字段定义在strings.xml文件里面
llTitle
.
getTvTitle
(
)
.
setText
(
resID
)
;
}
public
void
onDestroy
(
)
{
System
.
out
.
println
(
"> ShareSDKUIShell will be destroyed."
)
;
}
}
|
上面的onCreate、onResum、onStop、onDestroy等方法都在ShareSDKUIShell的生命周期不停时段被调用,如onCreate、onDestroy分别在授权页面被创建(但还没有显示),以及即将被关闭时被调用。也就是说可以通过这些方法参与授权页面的生命周期。而getPlatformName、getTitleLayout和getWebBody分别返回授权平台的名称、授权页面标题栏控件和授权页面主体部分的WebView,开发者可以通过平台名称和控件实例,修改整个页面的布局甚至行为。
请注意,注册在Adapter下的AuthorizeAdapter子类不能被混淆!否则ShareSDK无法找到这个类。
更多关于自定义授权页面的操作技巧,请参考ShareSDK BBS上的相关帖子。
ShareSDK将每一个平台的授权数据都缓存在SharedPreferences中,并且相互独立。如果您希望获取任何一个平台的授权数据,可以像下面这样子做:
1
2
3
4
5
|
Platform
qzone
=
ShareSDK
.
getPlatform
(
this
,
QZone
.
NAME
)
;
String
accessToken
=
qzone
.
getDb
(
)
.
getToken
(
)
;
// 获取授权token
String
openId
=
qzone
.
getDb
(
)
.
getUserId
(
)
;
// 获取用户在此平台的ID
String
nickname
=
qzone
.
getDb
(
)
.
get
(“
nickname”
)
;
// 获取用户昵称
// 接下来执行您要的操作
|
不同平台都会缓存accessToken、expiresIn、UserId、nickname等信息,分别表示授权的Token、授权Token的有效时间、用户在此平台上的ID、用户的昵称等信息。可以通过getToken()或者setToken()进行操作。此外,开发者还可以通过直接get()某个字段的办法,获取其数据,如上面通过“nickname”字段获取到用户的昵称。
ShareSDK同时还允许开发者使用“exportData”和“importData”两个方法,批量导出和导入PlatformDb中的数据。开放这两个方法的目的是:部分应用具备多用户系统,如果同一设备上不同时期要登录多个账户,那么他们需要备份上一个用户的资料。ShareSDK并不设置多用户系统,但是用户可以通过登录不同用户的时候,批量导出旧用户的资料,然后再登录新用户,直到新用户重新登录的似乎,重新导入其数据的方式,实现其多用户系统功能。
由于ShareSDK所有的授权数据都存在PlatformDb中,所以“用户是否”授权,和“取消授权(清除授权信息)”的操作依据其实PlatformDb。在ShareSDK中,判断此平台是否授权的方法是isValid,而取消授权的方法是removeAccount,下面的代码演示客户端判断是否已经授权,如果授权就删除授权资料,否则就执行授权:
1
2
3
4
5
6
7
|
Platform
qzone
=
ShareSDK
.
getPlatform
(
this
,
QZone
.
NAME
)
;
If
(
qzone
.
isValid
(
)
)
{
qzone
.
removeAccount
(
)
;
}
qzone
.
setPlatformActionListener
(
paListener
)
;
qzone
.
authorize
(
)
;
//isValid和removeAccount不开启线程,会直接返回。
|