1. 程式人生 > >使用友盟快速整合QQ分享與QQ授權登入

使用友盟快速整合QQ分享與QQ授權登入

在這裡插入圖片描述

在這裡插入圖片描述

我採用的是手動整合友盟的官方文件。下載SDK進行整合。 App並沒有上線,只是測試整合QQ分享與QQ授權登入。通過上圖也可以看到(未提交稽核)紅色標底的五個大字。

友盟和騰訊開放平臺都註冊成功後,現在開始我們的Demo。

開始我們的AndroidManifest.xml檔案中配置項

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.maigu.yang.umengdemo">

    <
uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
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> <!-- 友盟分享 --> <!-- QQ分享 --> <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="tencent1107929472" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> </application> </manifest>

App.java檔案

import android.app.Application;

import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;


public class App extends Application {

    {
        PlatformConfig.setQQZone("1107929472", "M673KwYa1vGU1lzt");
    }


    @Override
    public void onCreate() {
        super.onCreate();
        /*
         * 初始化common庫
         * 引數1:上下文,不能為空
         * 引數2:【友盟+】 AppKey
         * 引數3:【友盟+】 Channel
         * 引數4:裝置型別,UMConfigure.DEVICE_TYPE_PHONE為手機、UMConfigure.DEVICE_TYPE_BOX為盒子,預設為手機
         * 引數5:Push推送業務的secret
         */
        UMConfigure.init(this, "5bd27e33f1f55647610002b0",
                "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
        /*
        注意:
        引數1:上下文,必須的引數,不能為空。
        引數2:【友盟+】 AppKey,非必須引數,如果Manifest檔案中已配置AppKey,該引數可以傳空,則使用Manifest中配置的AppKey,否則該引數必須傳入。
        引數3:【友盟+】 Channel,非必須引數,如果Manifest檔案中已配置Channel,該引數可以傳空,則使用Manifest中配置的Channel,否則該引數必須傳入,Channel命名請詳見Channel渠道命名規範。
        引數4:裝置型別,必須引數,傳引數為UMConfigure.DEVICE_TYPE_PHONE則表示手機;傳引數為UMConfigure.DEVICE_TYPE_BOX則表示盒子;預設為手機。
        引數5:Push推送業務的secret,需要整合Push功能時必須傳入Push的secret,否則傳空。
         */
        UMShareAPI.get(this);//友盟

    }

}

然後是工具類MD5Util .java

import java.security.MessageDigest;

/*
 * MD5Util 演算法
*/
public class MD5Util {

    /**
     * 預設構造方法
     */
    private MD5Util() {

    }

    /**
     * MD5加密
     *
     * @param message 要進行MD5加密的字串
     * @return 加密結果為32位字串
     */
    public static String getMD5(String message) {
        MessageDigest messageDigest = null;
        StringBuffer md5StrBuff = new StringBuffer();
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(message.getBytes("UTF-8"));

            byte[] byteArray = messageDigest.digest();
            for (int i = 0; i < byteArray.length; i++) {
                if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
                } else {
                    md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
                }
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }
//        return md5StrBuff.toString().toUpperCase();//字母大寫
        return md5StrBuff.toString();//字母小寫
    }

}

activity_main.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_share"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="QQ分享"
        android:textAllCaps="false"
        tools:ignore="HardcodedText" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="QQ授權登入"
        android:textAllCaps="false"
        tools:ignore="HardcodedText" />

</LinearLayout>

MainActivity.java檔案

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.media.UMWeb;

import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_share;
    private Button btn_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        btn_share = (Button) findViewById(R.id.btn_share);
        btn_login = (Button) findViewById(R.id.btn_login);

        btn_share.setOnClickListener(this);
        btn_login.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_share:
                UMWeb web = new UMWeb("https://blog.csdn.net/ShenQiXiaYang");
                web.setTitle("暖暖的雲陽的部落格");//標題
                UMImage image1 = new UMImage(this, "https://avatar.csdn.net/F/E/5/1_shenqixiayang.jpg?1540524717");
                web.setDescription("關於移動裝置Android開發");//描述
                web.setThumb(image1);
                new ShareAction(this).withMedia(web)
                        .setDisplayList(SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE)
                        .setCallback(shareListener).open();
                break;
            case R.id.btn_login:
                UMShareAPI.get(this).getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, authListener);
                break;
            default:
                break;
        }
    }

    private UMAuthListener authListener = new UMAuthListener() {
        /**
         * @desc 授權開始的回撥
         * @param platform 平臺名稱
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {

        }

        /**
         * @desc 授權成功的回撥
         * @param platform 平臺名稱
         * @param action 行為序號,開發者用不上
         * @param data 使用者資料返回
         */
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            // 登入成功後,第三方平臺會將使用者資料傳回, 全部會在Map data中返回
            for (String key :
                    data.keySet()) {
                Log.e("暖暖的雲陽", "key = " + key + "  value = " + MD5Util.getMD5(data.get(key)) + "\n");
            }
            Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
        }

        /**
         * @desc 授權失敗的回撥
         * @param platform 平臺名稱
         * @param action 行為序號,開發者用不上
         * @param t 錯誤原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            Toast.makeText(MainActivity.this, "失敗:" + t.getMessage(), Toast.LENGTH_LONG).show();
        }

        /**
         * @desc 授權取消的回撥
         * @param platform 平臺名稱
         * @param action 行為序號,開發者用不上
         */
        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show();
        }
    };

    private UMShareListener shareListener = new UMShareListener() {
        /**
         * @descrption 分享開始的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {

        }

        /**
         * @descrption 分享成功的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
        }

        /**
         * @descrption 分享失敗的回撥
         * @param platform 平臺型別
         * @param t 錯誤原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            Toast.makeText(MainActivity.this, "失敗" + t.getMessage(), Toast.LENGTH_LONG).show();
        }

        /**
         * @descrption 分享取消的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onCancel(SHARE_MEDIA platform) {
            Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show();
        }
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
    }

    /**
     * 記憶體洩漏解決方案
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        UMShareAPI.get(this).release();
    }

}

執行效果圖: 在這裡插入圖片描述 然後分享到QQ中: 在這裡插入圖片描述 可以看到標題,描述,以及點選效果彈出網頁都是我們在程式碼中定義好的。OK,看下點選效果: 在這裡插入圖片描述

接下來就是QQ授權登入——確認頁面 在這裡插入圖片描述 以及在授權成功的回撥中拿到的所有的使用者資訊資料。

 /**
         * @desc 授權成功的回撥
         * @param platform 平臺名稱
         * @param action 行為序號,開發者用不上
         * @param data 使用者資料返回
         */
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            // 登入成功後,第三方平臺會將使用者資料傳回, 全部會在Map data中返回
            for (String key :
                    data.keySet()) {
                Log.e("暖暖的雲陽", "key = " + key + "  value = " + MD5Util.getMD5(data.get(key)) + "\n");
            }
            Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show();
        }

防止自己的QQ資訊洩露,我使用的MD5對個人資訊進行資料加密。 在這裡插入圖片描述