日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android qq 登陆 简书,使用QQ第三方登录

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android qq 登陆 简书,使用QQ第三方登录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,首先導入jar包

image.png

配置:

···

compile files('libs/open_sdk_r5990_lite.jar')

compile 'com.android.support:support-v4:26.0.0-alpha1'

···

在清單文件中添加以下權限,

···

···

添加activity標簽

···

android:name="com.tencent.tauth.AuthActivity"

android:launchMode="singleTask"

android:noHistory="true" >

android:theme="@android:style/Theme.Translucent.NoTitleBar"

android:screenOrientation="portrait"/>

···

main.xml布局:

image.png

xml布局:

···

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.lenovo.whkl.activity.LogoActivity">

android:id="@+id/logo_1"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="90dp"

android:layout_height="90dp"

android:background="@drawable/qq"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="161dp"

android:id="@+id/imageView2" />

android:text="qq登錄"

android:textSize="30sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/imageView2"

android:layout_centerHorizontal="true"

android:layout_marginTop="13dp" />

···

碎片中跳轉到Activity:

···

package com.example.lenovo.whkl.fragment;

import android.content.Intent;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.bumptech.glide.Glide;

import com.example.lenovo.whkl.R;

import com.example.lenovo.whkl.activity.LogoActivity;

/**

Created by lenovo on 2018/8/20.

*/

public class My_Fragment extends Fragment {

private TextView tx;

private ImageView img;

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate( R.layout.my_fragment, null);

RelativeLayout logo = view.findViewById(R.id.rll_logo);

tx = view.findViewById(R.id.textView);

img = view.findViewById(R.id.imageView);

logo.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent();

intent.setClass(getActivity(),LogoActivity.class);

startActivityForResult(intent,1);

}

});

return view ;

}

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode==1 && resultCode==2){

Bundle extras = data.getExtras();

tx.setText(extras.getString("nickname"));

Glide.with(getActivity()).load(extras.getString("figureurl_2")).into(img);

}

}

}

···

登錄Activity:

···

package com.example.lenovo.whkl.activity;

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.widget.Button;

import android.widget.RelativeLayout;

import android.widget.TextView;

import android.widget.Toast;

import com.example.lenovo.whkl.R;

import com.tencent.connect.UserInfo;

import com.tencent.connect.auth.QQToken;

import com.tencent.connect.common.Constants;

import com.tencent.tauth.IUiListener;

import com.tencent.tauth.Tencent;

import com.tencent.tauth.UiError;

import org.json.JSONException;

import org.json.JSONObject;

import butterknife.ButterKnife;

import butterknife.InjectView;

import butterknife.OnClick;

public class LogoActivity extends AppCompatActivity {

private static final String TAG = "LogoActivity";

private static final String APP_ID = "1107401709";//官方獲取的APPID

private Tencent mTencent;

private BaseUiListener mIUiListener;

private UserInfo mUserInfo;

String data="";

@InjectView(R.id.logo_1)

RelativeLayout logo1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_logo);

ButterKnife.inject(this);

//傳入參數APPID和全局Context上下文

mTencent = Tencent.createInstance(APP_ID,LogoActivity.this.getApplicationContext());

}

@OnClick(R.id.logo_1)

public void onViewClicked() {

/**通過這句代碼,SDK實現了QQ的登錄,這個方法有三個參數,第一個參數是context上下文,第二個參數SCOPO 是一個String類型的字符串,表示一些權限

官方文檔中的說明:應用需要獲得哪些API的權限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有權限用“all”

第三個參數,是一個事件監聽器,IUiListener接口的實例,這里用的是該接口的實現類 */

mIUiListener = new BaseUiListener();

//all表示獲取所有權限

Toast.makeText(this, "正在登錄,請稍等。。。", Toast.LENGTH_SHORT).show();

mTencent.login(LogoActivity.this,"all", mIUiListener);

}

private class BaseUiListener implements IUiListener {

@Override

public void onComplete(Object response) {

Toast.makeText(LogoActivity.this, "授權成功", Toast.LENGTH_SHORT).show();

Log.e(TAG, "response:" + response);

data+="response:\n"+response;

JSONObject obj = (JSONObject) response;

try {

String openID = obj.getString("openid");

String accessToken = obj.getString("access_token");

String expires = obj.getString("expires_in");

mTencent.setOpenId(openID);

mTencent.setAccessToken(accessToken,expires);

QQToken qqToken = mTencent.getQQToken();

mUserInfo = new UserInfo(LogoActivity.this,qqToken);

mUserInfo.getUserInfo(new IUiListener() {

@Override

public void onComplete(Object response) {

Log.e(TAG,"登錄成功"+response.toString());

data += "\nresponse:\n"+response;

try {

JSONObject jsonObject = new JSONObject(response.toString());

String nickname = jsonObject.getString("nickname");

String figureurl = jsonObject.getString("figureurl_2");

Intent intent = getIntent();

intent.putExtra("nickname",nickname);

intent.putExtra("figureurl_2",figureurl);

setResult(2,intent);

finish();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void onError(UiError uiError) {

Log.e(TAG,"登錄失敗"+uiError.toString());

}

@Override

public void onCancel() {

Log.e(TAG,"登錄取消");

}

});

} catch (JSONException e) {

e.printStackTrace();

}

}

@Override

public void onError(UiError uiError) {

Toast.makeText(LogoActivity.this, "授權失敗", Toast.LENGTH_SHORT).show();

}

@Override

public void onCancel() {

Toast.makeText(LogoActivity.this, "授權取消", Toast.LENGTH_SHORT).show();

}

}

/**

* 在調用Login的Activity或者Fragment中重寫onActivityResult方法

* @param requestCode

* @param resultCode

* @param data

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode == Constants.REQUEST_LOGIN){

Tencent.onActivityResultData(requestCode,resultCode,data,mIUiListener);

}

super.onActivityResult(requestCode, resultCode, data);

if (null != mTencent){

mTencent.onActivityResultData(requestCode,resultCode,data,mIUiListener);

}

}

}

···

ThreadMessage:

···

package com.example.lenovo.whkl.utils;

import android.os.AsyncTask;

import android.os.Build;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Looper;

import java.lang.reflect.Field;

import java.util.concurrent.Executor;

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.RejectedExecutionException;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public final class ThreadManager {

// UI線程

private static Handler mManinHandler;

private static Object mMainHandlerLock = new Object();

// 本地改就行..不要傳svn

public static final boolean DEBUG_THREAD = false;

/**

* AsyncTask的默認線程池Executor. 負責長時間的任務(網絡訪問) 默認3個線程

*/

public static final Executor NETWORK_EXECUTOR;

/**

* 副線程的Handle, 只有一個線程 可以執行比較快但不能在ui線程執行的操作. 文件讀寫不建議在此線程執行,

* 請使用FILE_THREAD_HANDLER 此線程禁止進行網絡操作.如果需要進行網絡操作. 請使用NETWORK_EXECUTOR

*/

private static Handler SUB_THREAD_HANDLER;

private static HandlerThread SUB_THREAD;

/**

* 文件讀寫線程的Handle, 只有一個線程 可以執行文件讀寫操作, 如圖片解碼等 此線程禁止進行網絡操作.如果需要進行網絡操作.

* 請使用NETWORK_EXECUTOR

*/

private static Handler FILE_THREAD_HANDLER;

/**

* 文件讀寫用的線程

*/

private static HandlerThread FILE_THREAD;

static {

NETWORK_EXECUTOR = initNetworkExecutor();

}

private static Executor initNetworkExecutor() {

Executor result = null;

// 3.0以上

if (Build.VERSION.SDK_INT >= 11) {

//result = AsyncTask.THREAD_POOL_EXECUTOR;

result = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,

new LinkedBlockingQueue());

}

// 3.0以下, 反射獲取

else {

Executor tmp = null;

try {

Field field = AsyncTask.class.getDeclaredField("sExecutor");

field.setAccessible(true);

tmp = (Executor) field.get(null);

} catch (Exception e) {

tmp = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS,

new LinkedBlockingQueue());

}

result = tmp;

}

if (result instanceof ThreadPoolExecutor) {

// core size減少為3個

((ThreadPoolExecutor) result).setCorePoolSize(3);

}

return result;

}

public static void init() {

}

/**

* 取得UI線程Handler

*

* @return

*/

public static Handler getMainHandler() {

if (mManinHandler == null) {

synchronized (mMainHandlerLock) {

if (mManinHandler == null) {

mManinHandler = new Handler(Looper.getMainLooper());

}

}

}

return mManinHandler;

}

/**

* 在網絡線程上執行異步操作. 該線程池負責網絡請求等操作 長時間的執行(如網絡請求使用此方法執行) 當然也可以執行其他 線程和AsyncTask公用

*

* @param run

*/

public static void executeOnNetWorkThread(Runnable run) {

try {

NETWORK_EXECUTOR.execute(run);

} catch (RejectedExecutionException e) {

}

}

/**

* 獲得文件線程的Handler.

* 副線程可以執行本地文件讀寫等比較快但不能在ui線程執行的操作.

* 此線程禁止進行網絡操作.如果需要進行網絡操作. 請使用NETWORK_EXECUTOR

*

* @return handler

*/

public static Handler getFileThreadHandler() {

if (FILE_THREAD_HANDLER == null) {

synchronized (ThreadManager.class) {

FILE_THREAD = new HandlerThread("QQ_FILE_RW");

FILE_THREAD.start();

FILE_THREAD_HANDLER = new Handler(FILE_THREAD.getLooper());

}

}

return FILE_THREAD_HANDLER;

}

public static Looper getFileThreadLooper() {

return getFileThreadHandler().getLooper();

}

public static Thread getSubThread() {

if (SUB_THREAD == null) {

getSubThreadHandler();

}

return SUB_THREAD;

}

/**

* 獲得副線程的Handler.

* 副線程可以執行比較快但不能在ui線程執行的操作.

* 另外, 文件讀寫建議放到FileThread中執行 此線程禁止進行網絡操作.如果需要進行網絡操作.

* 請使用NETWORK_EXECUTOR

*

* @return handler

*/

public static Handler getSubThreadHandler() {

if (SUB_THREAD_HANDLER == null) {

synchronized (ThreadManager.class) {

SUB_THREAD = new HandlerThread("QQ_SUB");

SUB_THREAD.start();

SUB_THREAD_HANDLER = new Handler(SUB_THREAD.getLooper());

}

}

return SUB_THREAD_HANDLER;

}

public static Looper getSubThreadLooper() {

return getSubThreadHandler().getLooper();

}

/**

* 在副線程執行.

* 可以執行本地文件讀寫等比較快但不能在ui線程執行的操作.

* 此線程禁止進行網絡操作.如果需要進行網絡操作. 請使用NETWORK_EXECUTOR

*

* @return

*/

public static void executeOnSubThread(Runnable run) {

getSubThreadHandler().post(run);

}

}

···

總結

以上是生活随笔為你收集整理的android qq 登陆 简书,使用QQ第三方登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。