116052018028+林振楠

fjnu_se發表於2021-01-01

一、準備工作

進入QQ互聯官網,點選應用開放平臺下的管理中心跳轉到個人開發者的註冊申請介面
在這裡插入圖片描述
2.申請好個人開發者賬後,點選建立一個專案,可以獲得一個APPID和APPKEY,記得儲存,後面要用
在這裡插入圖片描述
3.進入SDK下載頁面下載Android_SDK_Vx.x.x,解壓之後得到以下
在這裡插入圖片描述
進入libs下將open_sdk_3.5.1.157_re503bfe_lite.jar檔案拷貝到專案的libs資料夾下
在這裡插入圖片描述

二、實現QQ第三方登陸

新增許可權

    <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" />

新增activity,對應跳轉qq登陸的介面

        <!-- QQ的第三方登陸 -->-
        <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="tencent1111333510" />
            </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" />

實現Activity程式碼:

定義常量

	private Tencent mTencent;  //Tencent例項
    private String APP_ID = "1111333510";   
    private IUiListener loginListener;  //監聽
    private String SCOPE = "all";  //範圍

初始化監聽器

private void initQqLogin(){
        mTencent =  Tencent.createInstance(APP_ID, this);
        //建立QQ登入回撥介面
        loginListener = new IUiListener() {
            @Override
            public void onComplete(Object o) {
            	JSONObject jo = (JSONObject) o;
                Log.e("COMPLETE:", jo.toString());
                //登入成功後回撥該方法
                Toast.makeText(MainActivity6.this, "登入成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(UiError uiError) {
                //登入失敗後回撥該方法
                
                Toast.makeText(MainActivity6.this, "登入失敗", Toast.LENGTH_SHORT).show();
                Log.e("LoginError:", uiError.toString());
            }

            @Override
            public void onCancel() {
                //取消登入後回撥該方法
                Toast.makeText(MainActivity6.this, "取消登入", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onWarning(int i) {

            }
        };
    }

實現登陸結果回撥

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mTencent.onActivityResultData(requestCode, resultCode, data, loginListener);
        if (requestCode == Constants.REQUEST_API) {
            if (resultCode == Constants.REQUEST_QQ_SHARE ||
                    resultCode == Constants.REQUEST_QZONE_SHARE ||
                    resultCode == Constants.REQUEST_OLD_SHARE) {
                mTencent.handleResultData(data, loginListener);
            }
        }
    }

在onCreate方法中定義一個按鈕初始化環境並呼叫登入介面:

        Button btn = findViewById(R.id.ic_qq);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initQqLogin();
                mTencent.login(MainActivity6.this, SCOPE, loginListener);
            }
        });

效果圖
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020122118280067.gif#pic_center
116052018028+林振楠

三、實現QQ分享

實現Activity程式碼:

定義常量

    private IUiListener shareListener ;

初始化監聽器

    //QQ分享監聽
    private void initShare(){
        mTencent =  Tencent.createInstance(APP_ID, this);
        shareListener = new IUiListener() {
            @Override
            public void onComplete(Object o) {
                //分享成功後回撥
                Toast.makeText(MainActivity6.this, "分享成功!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(UiError uiError) {
                //分享失敗後回撥
            }

            @Override
            public void onCancel() {
                //取消分享後回撥
            }

            @Override
            public void onWarning(int i) {

            }
        };
    }

實現分享方法,更多型別的分享可以參考QQ分享

    public void share(View view)
    {
        Bundle params = new Bundle();
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        params.putString(QQShare.SHARE_TO_QQ_TITLE, "標題");
        params.putString(QQShare.SHARE_TO_QQ_SUMMARY,"摘要");
        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL,"http://blog.csdn.net/u013451048");
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,"http://avatar.csdn.net/C/3/D/1_u013451048.jpg");
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "CSDN");
        mTencent.shareToQQ(MainActivity6.this, params, shareListener);
    }

在onCreate方法中定義一個按鈕初始化環境並呼叫分享:

	initShare();
 	share(v);

分享效果:
116052018028+林振楠

分享失敗原因是appid未通過稽核,只允許開發者進行第三方登陸
在這裡插入圖片描述

四、常見錯誤

2020-12-21 15:46:44.906 5812-5861/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.example.myapplication, PID: 5812
    java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;
        at com.tencent.open.utils.HttpUtils.getHttpClient(ProGuard:634)
        at com.tencent.open.utils.HttpUtils.openUrl2(ProGuard:507)
        at com.tencent.open.utils.g$1.run(ProGuard:197)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.conn.scheme.SchemeRegistry" on path: DexPathList[[zip file "/data/app/~~5B-Ts-GeXWFIk_rTJLbHvA==/com.example.myapplication-K1q4IBrjVFa7bt0J17Ckxg==/base.apk"],nativeLibraryDirectories=[/data/app/~~5B-Ts-GeXWFIk_rTJLbHvA==/com.example.myapplication-K1q4IBrjVFa7bt0J17Ckxg==/lib/x86, /system/lib, /system_ext/lib, /product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.tencent.open.utils.HttpUtils.getHttpClient(ProGuard:634) 
        at com.tencent.open.utils.HttpUtils.openUrl2(ProGuard:507) 
        at com.tencent.open.utils.g$1.run(ProGuard:197) 

原因: 從 Android 9 開始,預設情況下Apache HTTP 客戶端內容庫已從 bootclasspath 中移除且不可用於應用。

解決:
在AndroidManifest.xml的application中設定此屬性

        android:usesCleartextTraffic="true"

且在application節點下新增以下內容

        <uses-library android:name="org.apache.http.legacy" android:required="false"/>

參考文章:
QQ官方文件:https://wiki.connect.qq.com/qq%E7%99%BB%E5%BD%95
CSDN文章:https://blog.csdn.net/chinaboyliusir/article/details/82755193

作者:林振楠
原文連結

相關文章