在Android 很多的APP应用中,都需要利用第三方登录来实现APP 自己本身应用的快速登录。这里的第三方平台,一般是已经有大量用户的平台,比如说国内的QQ,微信,国外的Facebook和Twitter 等,而本篇博客主要实现了这四个平台的登录。
QQ登录
首先进入 腾讯开放平台,登录后可以根据自己的需要注册个人或者公司的开发者账号,然后创建一个Android应用,获取应用的APPID。因为我本人很久之前就注册了开发者账号,不知道现在重新注册后会跳转到哪一个界面,所以已注册的开发者可以直接点击这,进入应用创建界面。创建应用成功后,能够得到应用的APP ID 和 APP KEY,第三方登录会用到这个信息。点击链接下载最新的SDK.jar,也可以在下面的项目中拿到已经下载好的jar 包。成功引用jar后,开始代码的实现。
首先实现一个监听:
public class BaseUiListener implements IUiListener {@Overridepublic void onCancel() {// TODO Auto-generated method stub}@Overridepublic void onComplete(Object arg0) {doComplete((JSONObject)arg0);}protected void doComplete(JSONObject values) {}@Overridepublic 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() {@Overrideprotected 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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);IWXAPI api = WXAPIFactory.createWXAPI(this, wechatAppID, true);api.handleIntent(getIntent(), this);}@Overridepublic void onReq(BaseReq req) {Log.i(TAG, "onReq...");}@Overridepublic 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() {@Overridepublic 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"/>...<activityandroid: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>() {@Overridepublic void onSuccess(LoginResult loginResult) {Toast.makeText(MainActivity.this, "Facebook 登录成功-----" + loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show();}@Overridepublic void onCancel() {// App code}@Overridepublic 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。
// 初始化TwitterTwitterConfig 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>() {@Overridepublic void success(Result<TwitterSession> result) {TwitterAuthToken authToken = result.data.getAuthToken();Toast.makeText(MainActivity.this, "Twitter 登录成功-----" + authToken, Toast.LENGTH_SHORT).show();}@Overridepublic 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。