在Android 很多的APP应用中,都需要利用第三方登录来实现APP 自己本身应用的快速登录。这里的第三方平台,一般是已经有大量用户的平台,比如说国内的QQ,微信,国外的Facebook和Twitter 等,而本篇博客主要实现了这四个平台的登录。
QQ登录
首先进入 腾讯开放平台,登录后可以根据自己的需要注册个人或者公司的开发者账号,然后创建一个Android应用,获取应用的APPID。因为我本人很久之前就注册了开发者账号,不知道现在重新注册后会跳转到哪一个界面,所以已注册的开发者可以直接点击这,进入应用创建界面。创建应用成功后,能够得到应用的APP ID 和 APP KEY,第三方登录会用到这个信息。点击链接下载最新的SDK.jar,也可以在下面的项目中拿到已经下载好的jar 包。成功引用jar后,开始代码的实现。
首先实现一个监听:
public class BaseUiListener implements IUiListener {
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object arg0) {
doComplete((JSONObject)arg0);
}
protected void doComplete(JSONObject values) {
}
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stu
}
}
然后在登录界面实现:
//应用需要获得哪些接口的权限,由“,”分隔 所有权限用“all”
String Scope = "get_user_info,add_t,qrcode";
// 启动QQ登录SDK
mTencent = Tencent.createInstance(QQAppID, getApplicationContext());
// 启动QQ登录SDK
listener = new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
Toast.makeText(MainActivity.this, "QQ 登录成功-----" + values, Toast.LENGTH_SHORT).show();
}
};
// 执行登录方法
mTencent.login(MainActivity.this, Scope, listener);
//应用调用Andriod_SDK接口时,如果要成功接收到回调,需要在调用接口的Activity的onActivityResult方法中增加如下代码:
if (requestCode == Constants.REQUEST_LOGIN) {
Tencent.onActivityResultData(requestCode, resultCode, data, listener);
}
最后还要在AndroidManifest.xml中增加配置的节点下增加以下配置(注:不配置将会导致无法调用API)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<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:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<application>
微信登录
首先进入微信开发平台,登录后可以根据自己的需要注册个人或者公司的开发者账号,然后创建一个Android应用。填写完毕后,点击 提交审核,提交审核成功,7天内微信会给出审核结果。审核通过后,应用的APPID和APPKey就可以使用了。审核通过后在管理中心的移动应用列表点击查看,拿到应用的AppID和AppSecret。因为微信SDK改成通过Gradle的方式发布到jcenter,所以在Android Studio 中的build.gradle文件中,添加远程依赖实现SDK 库的加载。
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类。
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private static final String TAG = "WXEntryActivity";
private String wechatAppID = "wxd38bb2e01fee8e55";
private String wechatAppSecret = "wxd38bb2e01fee8e55";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IWXAPI api = WXAPIFactory.createWXAPI(this, wechatAppID, true);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq req) {
Log.i(TAG, "onReq...");
}
@Override
public void onResp(BaseResp resp) {
Log.i(TAG, "onResp: " + resp);
String code = null;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:// 用户同意,只有这种情况的时候code是有效的
code = ((SendAuth.Resp) resp).code;
Log.i("Apptest", code);
try {
requesUserInfo(code);
} catch (Exception e) {
e.printStackTrace();
}
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:// 用户拒绝授权
Log.i("Apptest", "用户拒绝授权");
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:// 用户取消
Log.i("Apptest", "用户取消");
break;
default:// 发送返回
break;
}
finish();
}
public void requesUserInfo(final String code) {
final String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wechatAppID
+ "&secret=" + wechatAppSecret + "&code=" + code
+ "&grant_type=authorization_code";
final android.os.Handler handler = new android.os.Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle b = msg.getData();
String newsTemp = b.getString("msg");
Toast.makeText(WXEntryActivity.this, "微信登录成功-----" + newsTemp, Toast.LENGTH_SHORT).show();
}
};
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader br = null;
try {
URL url = new URL(path);
HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
httpconn.setRequestProperty("accept", "*/*");
httpconn.setDoInput(true);
httpconn.setDoOutput(true);
httpconn.setConnectTimeout(5000);
httpconn.connect();
int stat = 200;
String msg = "";
if (stat == 200) {
br = new BufferedReader(new InputStreamReader(httpconn.getInputStream()));
msg = br.readLine();
Bundle b = new Bundle();
b.putString("msg", msg);
Message m = new Message();
m.setData(b);
handler.sendMessage(m);
} else {
msg = "请求失败";
Log.i(TAG, msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
并在manifest文件里面加上exported属性,设置为true,并且添加权限支持
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name" />
然后在登录界面实现:
// 获取IWXAPI 实例
mIwxapi = WXAPIFactory.createWXAPI(MainActivity.this, wechatAppID, false);
// 将应用的APPID 注册到微信
mIwxapi.registerApp(wechatAppID);
// 发送登录请求
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_test";
mIwxapi.sendReq(req);
FaceBook 登录
因为大陆不能访问外国网站的原因,所以Facebook 的登录需要翻墙,这里默认大家都能成功翻墙,点击进入Facebook for developers,注册一个Facebook开发者账号。然后点击我的应用,选择添加新应用。在应用控制界面点击产品模块,添加Facebook 登录模块,点击快速启动创建Android应用。在创建的过程中,根据教程实现第三方登录,当第六步编辑完资源和清单文件后,执行下面的操作:
// 要获取的信息
List<String> permissions = Arrays.asList("email", "user_likes",
"user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
// 创建 callbackManager,以便处理登录响应
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(MainActivity.this, "Facebook 登录成功-----" + loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
//最后通过 callbackManager 将登录结果传递至 LoginManager。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 64206) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
Twitter 登录
因为大陆不能访问外国网站的原因,所以Twitter 的登录也需要翻墙,这里默认大家都能成功翻墙,点击进入Twitter移动开发,注册一个Twitter开发者账号,Twitter 开发者这里是需要审核的。审核通过后创建一个应用,拿到应用的TWITTER_KEY 和 TWITTER_SECRET。
// 初始化Twitter
TwitterConfig config = new TwitterConfig.Builder(MainActivity.this)
.logger(new DefaultLogger(Log.DEBUG))
.twitterAuthConfig(new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET))
.debug(true)
.build();
Twitter.initialize(config);
// 获取twitter 的客户端
twitterAuthClient = new TwitterAuthClient();
twitterAuthClient.authorize(MainActivity.this, new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
TwitterAuthToken authToken = result.data.getAuthToken();
Toast.makeText(MainActivity.this, "Twitter 登录成功-----" + authToken, Toast.LENGTH_SHORT).show();
}
@Override
public void failure(TwitterException exception) {
}
});
//最后通过 twitterAuthClient 将登录结果返回。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
twitterAuthClient.onActivityResult(requestCode, resultCode, data);
}
}
以上就是四个第三方平台第三方登录过程,具体的实现代码已提交到GitHub,点击查看Android QQ,微信,Facebook和推特第三方登录,欢迎fark,star。