基于开放平台的Android应用开发,是现在比较流行的。以腾讯开放平台的QQ登录为例做了个demo,平台上的Api不太清楚,而且有个别错误。
在网上看资料时,一定要注意下载的SDK的版本,不同的版本有的方法、类等会有不同(吃过亏,呜呜呜~~~)。
OK,废话不多说,直接上代码
1. 在腾讯开发平台上注册成为开发者,创建应用,获得APPID,下载SDK等这些步骤不说了,网上一大堆。SDK中的两个jar包导入 Android Studio的Module的libs中,然后Open Module Setting,添加依赖。
2. AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<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="tencent1105680096" />
intent-filter>
activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
application>
就是添加两个权限,两个Activity。
3.布局文件activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_tencent_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/qq" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="账号信息"
android:textSize="25sp" />
ScrollView>
LinearLayout>
布局文件中,ImageView用于点击进行登录,TextView用于显示信息。
4.MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView textView;
private Tencent mTencent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//qq登录图标设置点击监听
findViewById(R.id.iv_tencent_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "点击了QQ登录", Toast.LENGTH_SHORT).show();
//创建Tencent类的实例,参数一:APPID,参数二:上下文
mTencent = Tencent.createInstance("1105680096", MainActivity.this);
/*Tencent类的login函数发起登录,参数一:上下文,参数二:scope权限,参数三:
事件监听器,IUiListener接口的实例,这里用的是该接口的实现类,调用login方法后,
就会监听登录事件,登录成功或者失败后,会回调监听器里面的几个方法*/
mTencent.login(MainActivity.this, "all", new mIUiListener());
}
});
}
/**
* IUiListener接口的实现类
*/
private class mIUiListener implements IUiListener {
/**
* 回调成功
* @param response :参数response封装了一些关键的信息
*/
@Override
public void onComplete(Object response) {
Log.i(TAG, "onComplete: 回调成功!");
Toast.makeText(MainActivity.this, "回调成功!", Toast.LENGTH_SHORT).show();
JSONObject jsonResponse = (JSONObject) response;
Log.i(TAG, "onComplete: JSONObject的值:" + String.valueOf(jsonResponse));
textView = (TextView) findViewById(R.id.tv_info);
textView.setText(String.valueOf(jsonResponse));
//登录成功后,如果想要拿到qq账户的一些昵称,头像等信息,还需往下继续走
getInfo();
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
}
/**
* 获得qq账号信息
*/
private void getInfo() {
QQToken qqToken = mTencent.getQQToken();
//需要两个参数,参数一:上下文,参数二:QQToken类实例
UserInfo userInfo = new UserInfo(MainActivity.this,qqToken);
userInfo.getUserInfo(new IUiListener() {
@Override
public void onComplete(Object response) {
Log.i(TAG, "onComplete2: Object的值:"+String.valueOf(response));
JSONObject jsonObject = (JSONObject) response;
Log.i(TAG, "onComplete2: JSONObject的值:"+String.valueOf(jsonObject));
textView.setText(textView.getText()+"########"+String.valueOf(jsonObject));
String nickname = jsonObject.optString("nickname");
Log.i(TAG, "onComplete2: nickname的值:"+nickname);
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
});
}
}
5.总结
(1)Tencent.createInstance()方法得到Tencent的实例,用这个实例的login方法实现登录。
(2)login方法中第三个参数是登录的事件监听器,也就是IUiListener接口,无论登录成功与否,都会回调其中的方法。所以把IUiListener接口的实现类传进去。 登录成功回调onComplete方法,我们就可以在这个方法中进行我们的开发。
(3)想要获取账号的信息,就需要使用。
QQToken qqToken = mTencent.getQQToken();
//需要两个参数,参数一:上下文,参数二:QQToken类实例
UserInfo userInfo = new UserInfo(MainActivity.this,qqToken);
获得UserInfo类的实例,UserInfo的getUserInfo()方法能够获得QQ账号信息,同时这个方法也需要传入IUiListener接口的实现类,获得信息成功,回调onComplete方法,这个方法中的参数Object中就存有账号信息,先把Object强制转换成JSONObject类,就可以获得信息了。
JSONObject jsonObject = (JSONObject) response;
String nickname = jsonObject.optString("nickname");//昵称
如果有错误,以开放平台API为准,地址http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B