安卓常用第三方平台的分享以及登录
这里只讨论微博——QQ——微信原生的分享和登录,不使用第三方的SDK
在使用之前,几个平台都需要完善开发者信息,需要身份证或营业执照之类的信息
微博
首先是微博,先进入微博开放平台选择移动应用
填写应用信息,选择平台,然后创建之后会完善一下应用信息,先填一下基本信息,重点注意包名和签名,这部分要和APP的一致。然后是高级信息里面的授权回调页和取消授权回调页也注意一下,另外如果没有通过审核的话需要测试账号才能分享和登录,所以如果有需要的话,在测试信息里面加上相关账号。
然后我们拿到AppId,AppSecret,回调地址
在调用分享或者授权的代码之前,先要导一下包,先在根目录的gradle里面的allprojects下添加maven { url “https://dl.bintray.com/thelasterstar/maven/" }
然后在module的gradle文件的依赖添加compile ‘com.sina.weibo.sdk:core:4.3.0:openDefaultRelease@aar’,然后注册一下应用
AuthInfo mAuthInfo = new AuthInfo(this, APP_KEY, REDIRECT_URL, "");
WbSdk.install(this,mAuthInfo);
微博授权
mSsoHandler = new SsoHandler(this);
// SSO 授权, 仅客户端
mSsoHandler.authorizeClientSso(new AuthListener());
// SSO 授权, 仅Web
mSsoHandler.authorizeWeb(new WbAuthListener());
// SSO 授权, ALL IN ONE 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
mSsoHandler.authorize(new WbAuthListener());
```
WbAuthListener类需要实现微博的WbAuthListener接口,在重写的三个回调方法里面处理成功失败和取消,成功回调会直接返回Token,另外要注意的一点是在请求sso的activity必须重写onActivityResult,在这个方法里面需要调用
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
有了上面的token,就可以从token里面拿到access_token和uid,从而获取用户资料,具体的接口参考http://open.weibo.com/wiki/2/users/show
微博分享
微博可以分享文本,单图,多图,网页(链接的形式,目前测试好像分享不出去,如果要分享链接的话,直接将链接拼接在文本后面)和视频
AuthInfo mAuthInfo = new AuthInfo(this, APP_KEY, REDIRECT_URL, "");
WbSdk.install(this,mAuthInfo);
// mSsoHandler = new SsoHandler(this);
//
// mSsoHandler.authorize(this);
wbShareHandler = new WbShareHandler(this);
wbShareHandler.registerApp();
WeiboMultiMessage message = new WeiboMultiMessage();
message.textObject = getTextObj();
message.imageObject = getImageObj();
// message.mediaObject = getWebpageObj();
message.multiImageObject = getMultiImageObject();
message.videoSourceObject = getVideoObject();
wbShareHandler.shareMessage(message,false);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
wbShareHandler.doResultIntent(intent,this);
}
在onNewIntent方法调用的接口是用于处理回调的,记得要调用。
具体的构造各种类型参数的方法如下
/**
* 创建文本消息对象。
* @return 文本消息对象。
*/
private TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = "text";
textObject.title = "xxxx";
textObject.actionUrl = "http://www.baidu.com";
return textObject;
}
private ImageObject getImageObj() {
ImageObject imageObject = new ImageObject();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
imageObject.setImageObject(bitmap);
return imageObject;
}
/**
* 创建多媒体(网页)消息对象。
*
* @return 多媒体(网页)消息对象。
*/
private WebpageObject getWebpageObj() {
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title ="测试title";
mediaObject.description = "测试描述";
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
// 设置 Bitmap 类型的图片到视频对象里 设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。
mediaObject.setThumbImage(bitmap);
mediaObject.actionUrl = "http://news.sina.com.cn/c/2013-10-22/021928494669.shtml";
mediaObject.defaultText = "Webpage 默认文案";
return mediaObject;
}
/***
* 创建多图
* @return
*/
private MultiImageObject getMultiImageObject(){
MultiImageObject multiImageObject = new MultiImageObject();
//pathList设置的是本地本件的路径,并且是当前应用可以访问的路径,现在不支持网络路径(多图分享依靠微博最新版本的支持,所以当分享到低版本的微博应用时,多图分享失效
// 可以通过WbSdk.hasSupportMultiImage 方法判断是否支持多图分享,h5分享微博暂时不支持多图)多图分享接入程序必须有文件读写权限,否则会造成分享失败
ArrayList<Uri> pathList = new ArrayList<Uri>();
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/aaa.png")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/bbbb.jpg")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/ccc.JPG")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/ddd.jpg")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/fff.jpg")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/ggg.JPG")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/eee.jpg")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/hhhh.jpg")));
pathList.add(Uri.fromFile(new File(getExternalFilesDir(null)+"/kkk.JPG")));
multiImageObject.setImageList(pathList);
return multiImageObject;
}
private VideoSourceObject getVideoObject(){
//获取视频
VideoSourceObject videoSourceObject = new VideoSourceObject();
videoSourceObject.videoPath = Uri.fromFile(new File(getExternalFilesDir(null)+"/eeee.mp4"));
return videoSourceObject;
}
和微博一样,使用之前,先在腾讯开放平台创建一下应用
然后完善一下软件的基本信息,由于QQ登录需要提交审核或者是测试账号才能使用,所以在登录之前要生成apk提交审核。
完善信息之后直接保存就可以在管理中心看到刚刚创建的应用,点击这个应用可以进入应用详情界面,里面可以看到需要的AppId和AppKey。
使用之前先在这http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD 下载一下SDK
首先配置一下网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
以及两个activity,注意要换下tencent后面的appid为自己的
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent你的AppId" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
另外还需要实现一下回调IUiListener接口以及在onActivityResult方法处理一下
Tencent.onActivityResultData(requestCode,resultCode,data,listener);
QQ授权
授权的代码很简单,this代表本上面实现的IUiListener接口
mTencent.login(this, "all", this);
然后在上面实现的回调类的OnComplete方法就可以根据参数拿到OpenId, AccessToken参数
如果要获取详细的用户信息,我们直接请求这个地址去获取 <
https://graph.qq.com/user/get_user_info?access_token=***&oauth_consumer_key=***&openid=*** > ,注意将token,oauth_consumer_key(自己的appid),openid换成自己的,这些可以从上面的授权里面拿到
QQ分享
QQ分享支持图文链接,单图,音乐和应用
分享代码很简单
mTencent.shareToQQ(this, bundle , listener);
主要是分享类型所需要的参数bundle的构造,具体的信息看http://wiki.open.qq.com/index.php?title=Android_API%E8%B0%83%E7%94%A8%E8%AF%B4%E6%98%8E&=45038里面的分享消息到QQ
以分享图文链接为例
final Bundle params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222");
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, "其他附加功能");
mTencent.shareToQQ(MainActivity.this, params, new BaseUiListener());
微信
首先在微信开放平台创建应用,填写应用信息的时候注意包名和签名,都填完之后等待审核完成才能使用,注意微信登录还需要在接口列表点击申请一下,这个是需要开发者资质认证的。
然后我们拿到AppId和AppSecret
使用之前先在gradle配置一下implementation ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’
导入对应的包,并注册一下应用
api = WXAPIFactory.createWXAPI(this,APP_ID,true);
api.registerApp(APP_ID);
要注意的是回调必须在WXEntryActivity的oncreate方法调用
api.handleIntent(getIntent(),this);
微信授权
调用代码
if (!api.isWXAppInstalled())
return;
final SendAuth.Req req = new SendAuth.Req();
req.scope="snsapi_userinfo";
req.state="wechat_sdk_demo_test";
api.sendReq(req);
如果签名、包名以及WXEntryActivity的位置都正确的话,那么接下来授权的回调会走到WXEntryActivity的onResp方法,这里会返回给code
@Override
public void onResp(BaseResp baseResp) {
Log.i("ssss","onResp");
switch (baseResp.errCode){
case BaseResp.ErrCode.ERR_OK:
if (baseResp.getType()==2){
//分享
}else if (baseResp.getType()==1){
//登录
String code = ((SendAuth.Resp)baseResp).code;
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
break;
}
}
,如果不知道code是什么,可以了解一下OAuth2协议,有了code之后,就可以向微信去获取access_token和refresh_token和openid
具体的请求地址是<”https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx4868b35061f87885&secret=64020361b8ec4c99936c0e3999a9f249&code="+code+"&grant_type=authorization_code > ,这里授权就算成功了,如果需要具体的用户信息可以向这个地址请求 < https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID >
另外如果token过期还需要用专门的方法刷新token < https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN >可以获取到access_token
微信分享
微信分享目前支持文字、图片、音乐、视频、网页和小程序,可以分享到好友,朋友圈和微信收藏,分别对应三种scene
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite
这里以分享网页到微信好友为例
WXWebpageObject fileObject = new WXWebpageObject();
fileObject.webpageUrl = "https://www.baidu.com";
WXMediaMessage msg = new WXMediaMessage(fileObject);
msg.title = "Title"; // 小程序消息title
msg.description = "Desc";
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ab);
Bitmap thumbImgNow = Bitmap.createScaledBitmap(bmp,750,500, true);
bmp.recycle();
// Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
// bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbImgNow, true);
// msg.setThumbImage(thumbImgNow);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession; // 目前支持会话
api.sendReq(req);
可以看到SendMessageToWX.Req的transaction指定了分享的类型,message指定了分享的内容,scene指定了分享到好友还是朋友圈。具体的参数参考https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=&lang=zh_CN