Android QQ、微信、Facebook和推特第三方登录

        在Android 很多的APP应用中,都需要利用第三方登录来实现APP 自己本身应用的快速登录。这里的第三方平台,一般是已经有大量用户的平台,比如说国内的QQ,微信,国外的Facebook和Twitter 等,而本篇博客主要实现了这四个平台的登录。
Android QQ、微信、Facebook和推特第三方登录_第1张图片

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,并且添加权限支持

"android.permission.INTERNET"/>

"android.permission.ACCESS_NETWORK_STATE"/>

"android.permission.ACCESS_WIFI_STATE"/>

"android.permission.READ_PHONE_STATE"/>

"android.permission.WRITE_EXTERNAL_STORAGE"/>

...

".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 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() {
        @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() {
    @Override
    public void success(Result 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。

你可能感兴趣的:(Android)