關於Android Studio第三方登入(使用QQ登入)程式碼
阿新 • • 發佈:2019-02-11
關於Android Studio第三方登入(使用QQ登入)
新手上路,寫的不好或者有錯誤之處請各位大神多多指教!!!
現在很多APP應用都實現了第三方登入:比如QQ登入、微信登入、微博登入等等。其實實現起來非常簡單,那麼廢話就不多說了,接下來我們看看如何實現第三方登入。
1.首先我們需要到騰訊開發平臺區申請一個開發者的賬號,申請好了後登入。點選建立應用一步步往下就會獲取到:APP ID:1105345875和APP KEY:********
(很重要哦APP_ID)
2.QQ登入第三方SDK下載地址:
Android_API呼叫說明:
3.點選下載Android版本的SDK。下載好後解壓複製jar檔案裡面的mta-sdk-1.6.2.jar和open_sdk_r5509.jar放到AS專案中的libs資料夾下。然後選中這兩個jar包,右鍵Add Library新增庫,這樣就可以呼叫SDK的程式碼了。
4.點選:AndroidManifest.xml檔案,新增uses-permission如下程式碼:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.jack.keep"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- SDK2.1新增獲取使用者位置資訊 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <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.GET_TASKS" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher_0" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".LinkUrlActivity" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ZhuCeActivity" /> <activity android:name="com.example.jack.keep.DengLvActivity" /> <!--QQ SDK 必須寫--> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <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="1105345875" /> </intent-filter> </activity> </application> </manifest>
5.佈局檔案程式碼如下:
<?xml version="1.0" encoding="utf-8"?> <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:background="#FF666771" android:orientation="vertical" tools:context="com.example.jack.keep.DengLvActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp"> <ImageView android:layout_width="40dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:src="@mipmap/return_up" /> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:gravity="center" android:text="登陸" android:textColor="@color/white" android:textSize="18sp" /> </RelativeLayout> <TextView android:layout_width="match_parent" android:layout_height="30dp" android:visibility="invisible" /> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@drawable/bianjibag" android:orientation="horizontal"> <LinearLayout android:id="@+id/ll01" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:orientation="horizontal"> <ImageView android:layout_width="30dp" android:layout_height="wrap_content" android:paddingLeft="2.5dp" android:paddingRight="2.5dp" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="30dp" android:layout_height="match_parent" android:gravity="center" android:text="+86" android:textSize="12sp" /> </LinearLayout> <ImageView android:layout_width="2dp" android:layout_height="match_parent" android:layout_margin="5dp" android:background="@color/blue" /> <EditText android:id="@+id/et01" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:cursorVisible="true" android:gravity="center|left" android:hint="請輸入手機就號碼" android:inputType="number" android:singleLine="true" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="20dp" android:background="@drawable/bianjibag" android:orientation="horizontal"> <ImageView android:layout_width="30dp" android:layout_height="wrap_content" android:paddingLeft="2.5dp" android:paddingRight="2.5dp" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="30dp" android:layout_height="match_parent" android:gravity="center" android:text="密碼" android:textSize="12sp" /> <ImageView android:layout_width="2dp" android:layout_height="match_parent" android:layout_margin="5dp" android:background="@color/blue" /> <EditText android:id="@+id/et02" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:cursorVisible="true" android:gravity="center|left" android:hint="請輸入手機就號碼" android:inputType="numberPassword" android:singleLine="true" /> </LinearLayout> <Button android:id="@+id/denglv" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="20dp" android:background="@drawable/btnbg" android:text="登陸" android:textColor="@color/white" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="30dp" android:layout_margin="10dp"> <TextView android:id="@+id/zhuce" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="註冊" /> <TextView android:id="@+id/wangjimima" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center" android:text="忘記密碼?" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="56dp" android:orientation="horizontal"> <ImageView android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="@color/blue" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_weight="1" android:gravity="center" android:text="其他方式登陸" android:textColor="@color/white" android:textSize="14sp" /> <ImageView android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1" android:background="@color/blue" /> </LinearLayout> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/radio01" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="20dp" android:layout_weight="1" android:background="@mipmap/share_qqbtn" android:button="@null" android:checked="false" android:gravity="center" /> <RadioButton android:id="@+id/radio02" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="20dp" android:layout_weight="1" android:background="@mipmap/share_wechatbtn" android:button="@null" /> </RadioGroup> <ImageView android:layout_width="match_parent" android:layout_height="1dp" android:layout_margin="10dp" android:layout_marginTop="20dp" android:background="@color/blue" /> </LinearLayout>
6.登入介面程式碼:
public class DengLvActivity extends AppCompatActivity implements View.OnClickListener{
private EditText user;//使用者名稱
private EditText pw;//密碼
private RadioButton qqRadio;//QQ登入
private RadioButton weixingRadio;//微信登入
private Button startBtn;
private static final String TAG = DengLvActivity.class.getName();//獲取當前的名字
//tencent sdk原始碼
private Tencent mTencent;
private IUiListener loginListener;
private IUiListener userInfoListener;
private String scope;
private UserInfo userInfo;
private final String APP_ID = "1105345875";// 測試時使用,真正釋出的時候要換成自己的APP_ID
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//設定全屏
setContentView(R.layout.activity_deng_lv);
initviews();
initdatas();
}
//銷燬QQ登入
@Override
protected void onDestroy() {
if (mTencent != null) {
mTencent.logout(DengLvActivity.this);
}
super.onDestroy();
}
/**
* 初始化資料
*/
String userName;
String userPw;
private void initdatas() {
//獲取使用者名稱和密碼
userName=user.getText().toString();
userPw=pw.getText().toString();
if(TextUtils.isEmpty(userName)&&TextUtils.isEmpty(userPw)){
Toast.makeText(this, "請輸入內容", Toast.LENGTH_SHORT).show();
}else {
startActivity(new Intent(DengLvActivity.this, MainActivity.class));
}
//
mTencent = Tencent.createInstance(APP_ID, DengLvActivity.this);
//要所有許可權,不用再次申請增量許可權,這裡不要設定成get_user_info,add_t
scope = "all";
loginListener = new IUiListener() {
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object value) {
// TODO Auto-generated method stub
System.out.println("有資料返回..");
if (value == null) {
return;
}
try {
JSONObject jo = (JSONObject) value;
String msg = jo.getString("msg");
System.out.println("json=" + String.valueOf(jo));
System.out.println("msg="+msg);
if ("sucess".equals(msg)) {
Toast.makeText(DengLvActivity.this, "登入成功",
Toast.LENGTH_LONG).show();
String openID = jo.getString("openid");
String accessToken = jo.getString("access_token");
String expires = jo.getString("expires_in");
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
};
userInfoListener = new IUiListener() {
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object arg0) {
// TODO Auto-generated method stub
if(arg0 == null){
return;
}
try {
JSONObject jo = (JSONObject) arg0;
int ret = jo.getInt("ret");
System.out.println("json=" + String.valueOf(jo));
if(ret == 100030){
//許可權不夠,需要增量授權
Runnable r = new Runnable() {
public void run() {
mTencent.reAuth(DengLvActivity.this, "all", new IUiListener() {
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Object arg0) {
// TODO Auto-generated method stub
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
});
}
};
DengLvActivity.this.runOnUiThread(r);
}else{
String nickName = jo.getString("nickname");
String gender = jo.getString("gender");
Toast.makeText(DengLvActivity.this, "你好," + nickName, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
};
}
//qq登入方法
private void login() {
if (!mTencent.isSessionValid()) {
mTencent.login(DengLvActivity.this, scope, loginListener);
}
}
//在某些低端機上呼叫登入後,由於記憶體緊張導致APP被系統回收,登入成功後無法成功回傳資料。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQUEST_API) {
if (resultCode == Constants.REQUEST_LOGIN) {
Tencent.handleResultData(data, loginListener);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
/**
* 初始化元件
*/
private void initviews() {
user= (EditText) findViewById(R.id.et01);
pw= (EditText) findViewById(R.id.et02);
startBtn= (Button) findViewById(R.id.denglv);
qqRadio = (RadioButton) findViewById(R.id.radio01);//qq登入按鈕
//qqRadio進行監聽
qqRadio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("點選並使用qq登入按鈕");
login();
}
});
}
}