Unity实战篇 | unity接入QQ登录 详细过程——配置Android端的环境和代码

呆呆敲代码的小Y 发表于 2022/03/31 19:31:57 2022/03/31
【摘要】 @[toc] 📢前言在项目中接入 QQ登录 是一件很常见的事情。所以用这一篇文章来做一个简单的 接入QQ登录 的案例用来学习。本文会从怎样获取SDK开始讲起,一起来看看吧! 第2️⃣步:配置Android端的环境和代码拿到APPID之后我们用Android Studio创建一个应用。 创建应用老规矩,新建项目,修改名字和路径,准备开始!这里有一个注意的点,就是勾选上图中的 Use lega...

在这里插入图片描述

@[toc]


📢前言

  • 在项目中接入 QQ登录 是一件很常见的事情。
  • 所以用这一篇文章来做一个简单的 接入QQ登录 的案例用来学习。
  • 本文会从怎样获取SDK开始讲起,一起来看看吧!

请添加图片描述


第2️⃣步:配置Android端的环境和代码

拿到APPID之后我们用Android Studio创建一个应用。

创建应用

老规矩,新建项目,修改名字和路径,准备开始!
在这里插入图片描述
在这里插入图片描述
这里有一个注意的点,就是勾选上图中的 Use legacy android.support libraries

因为我在测试的时候,未勾选这个老是提示support包报错,勾选上就没事了,这个问题应该是Android Studio版本问题,注意一下就好了!

接入Unity的classes.jar包 和 QQ SDK中的jar

  • 把Unity的class接入,路径在安装Unity客户端的路径下。
  • Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
  • 把Unity的jar包复制到AS的libs目录下,QQ SDK中的jar则是在我们下载的压缩包的lib文件夹中。
  • 如下图所示:
    在这里插入图片描述
    然后选中两个jar包,右键 Add As Libray… ,等待编译完就好了
    在这里插入图片描述

编写QQ登录的脚本,直接在Mainactivity类上修改

有一个注意的点,就是将 APPID 换成我们在开发者平台自己创建的那个即可。

完整代码如下:

package com.example.qqlogin;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import com.tencent.connect.UserInfo;
import com.tencent.connect.common.Constants;

import com.tencent.tauth.IUiListener;
import com.tencent.tauth.UiError;
import com.tencent.tauth.Tencent;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

//把Activity改成UnityPlayerActivity
public class MainActivity extends UnityPlayerActivity {

    public static Tencent mTencent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
    }
    //unity调用的登录方法
    public void LoginQQ()
    {//定义一个对象,里面的第一个参数是自己在QQ开放平台上申请的APPID。
        mTencent = Tencent.createInstance("申请的APPID",this.getApplicationContext());
        if (!mTencent.isSessionValid())
        {
            mTencent.login(this, "all", loginListener);
        }
    }
    //登陆成功设置token和openid 这两个值用于服务器校验账号或者相关逻辑
    public void initOpenidAndToken(JSONObject jsonObject) {
        try {
            String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
            String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
            String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
            if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)
                    && !TextUtils.isEmpty(openId)) {
                mTencent.setAccessToken(token, expires);
                mTencent.setOpenId(openId);
            }
            Log.e("initOpenidAndToken",jsonObject.toString());
        } catch(Exception e) {
            System.out.println(e.toString());
        }
    }

    //登陆成功回调
    IUiListener loginListener = new BaseUiListener() {
        @Override
        protected void doComplete(JSONObject values) {
            initOpenidAndToken(values);//上面设置token和openid的
            GetInfo();//获取个人信息的函数
        }
    };
    //获取个人信息
    public void GetInfo(){
        Log.e("GetInfo","GetInfo");
        UserInfo info = new UserInfo(MainActivity.this, mTencent.getQQToken());
        info.getUserInfo(new IUiListener() {
            @Override
            public void onComplete(Object object) {
                Log.e("onComplete", "个人信息:" + object.toString());
                try {
                    String nickname = ((JSONObject) object).getString("nickname");
                    UnityPlayer.UnitySendMessage("GameManager","AndroidCallBack",nickname);//向Unity发送回调信息
                } catch (JSONException e) {
                }
            }
            @Override
            public void onError(UiError uiError) {
            }
            @Override
            public void onCancel() {
            }

            @Override
            public void onWarning(int i) {

            }
        });
    }
    //重要!回调反馈
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Constants.REQUEST_LOGIN ||
                requestCode == Constants.REQUEST_APPBAR) {
            Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    //监听回调的类
    private class BaseUiListener implements IUiListener {
        @Override
        public void onComplete(Object response) {
            if (null == response) {
                return;
            }
            JSONObject jsonResponse = (JSONObject) response;
            if (jsonResponse.length() == 0) {
                return;
            }
            doComplete((JSONObject) response);
        }
        protected void doComplete(JSONObject values) {
        }
        @Override
        public void onError(UiError e) {
        }
        @Override
        public void onCancel() {
        }
        @Override
        public void onWarning(int i) {

        }
    }
}

修改AndroidManifest文件

AndroidManifest中加入下面一行代码,别忘记修改成自己申请的APPID

 <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>

完整代码如下所示:

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

    <application
        android:allowBackup="true"
        android:label="QQLogin"
        android:supportsRtl="true">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
        </activity>

        <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="申请的APPID" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <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" />
    
</manifest>

修改build.gradle为aar形式

打开build.gradle,改成library,否则Build的时候会打包成APK形式。

还要把applicationId注释掉,要不然打包会报错。
在这里插入图片描述

打包aar

  • 好了,如果确定上面一步里的包名APPID 等都填写正确了
  • 那在AS端的操作也就算完成了,接下来就是打包成 aar 给Unity使用就好了!
  • 按照下图所示,先选中这个文件夹,然后 Build - > Make Module “QQLogin.app”
  • 开始这三步之前先点击右边那个小按钮编译一下最好!

但在这之前,我们可以先把res文件夹下的 内容都删掉,因为他对我们没有用处。

这个res文件夹是用于在进行Android开发的时候存放一些图片等资源的文件夹
在这里插入图片描述
删掉之后,选中app文件夹点击Build
在这里插入图片描述

然后取出我们的aar文件,将aar中lib文件夹下的class包删除掉。
在这里插入图片描述
在这里插入图片描述

Android端的操作就做完了,下面就是在Unity中调用了,一起来接着做,Unity端的就简单多了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。