使用友盟快速集成QQ分享与QQ授权登录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ShenQiXiaYang/article/details/83413153

友盟官方文档

在这里插入图片描述
我采用的是手动集成友盟的官方文档。下载SDK进行集成。
在这里插入图片描述
解压缩,选择自己需要的文件进行加入到Android Studio中。
在这里插入图片描述
由于这里我只需要QQ,那就把QQ文件夹中的所有文件拷贝一份到AndroidStudio中。然后再把一些共有的jar也拷贝到AndroidStudio中。下图就是我所需要的所有的libs。在这里插入图片描述

腾讯开放平台

在这里插入图片描述

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对个人信息进行数据加密。
在这里插入图片描述

源码下载

猜你喜欢

转载自blog.csdn.net/ShenQiXiaYang/article/details/83413153