安卓常用第三方平台的分享以及登录

这里只讨论微博——QQ——微信原生的分享和登录,不使用第三方的SDK
在使用之前,几个平台都需要完善开发者信息,需要身份证或营业执照之类的信息

微博

首先是微博,先进入微博开放平台选择移动应用
mark
填写应用信息,选择平台,然后创建之后会完善一下应用信息,先填一下基本信息,重点注意包名和签名,这部分要和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

和微博一样,使用之前,先在腾讯开放平台创建一下应用
mark
然后完善一下软件的基本信息,由于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