Unity接入原生QQ登录

前言

我是做Unity的,闲来无事想接一下qq登陆。(说来惭愧入行三年没碰过安卓,这次也算是小小看一下)

提前需要准备的东西

1.AndroidStudio(3.5.3)

2.Unity(2019.1.12f1)

3.jdk(1.8)

4.QQ原生SDK

(下载链接:https://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD)
参考了网上各位大佬的方法,多少有些异同(版本原因)

以下为具体步骤

1 新建安卓工程

打开AndroidStudio新建工程1-1
打开AndroidStudio新建工程1-2
打开AndroidStudio新建工程1-3
打开AndroidStudio新建工程1-4

修改工程文件用来生成aar

打开project目录

在这里插入图片描述

将下载好的SDK中的jar包和Unity目录下的classes.jar放入libs文件夹下SDK中的jar

Unity中的classed.jar

将导入的两个包作为一个库用

点完 add as library有个小框点ok
在这里插入图片描述
完事是这个样子
在这里插入图片描述

下面是修改mainactivity类

下面有个腾讯的appid需要自己申请一下 很容易

//添加头文件
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);
        }
        //UnityPlayer.UnitySendMessage("GameManager","AndroidCallBack","CallBackInfo");
    }
    //登陆成功设置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
    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() {
        }
    }
}

修改build.gradle

不修改build.gradle不会生成aar 生成的是apk 注意一下
在这里插入图片描述
修改依赖项
在这里插入图片描述

修改androidmanifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qqlogin.loginbyqq"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="29" />

    <application>
        <activity android:name="com.qqlogin.loginbyqq.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>
    </application>

</manifest>

build工程

build完工程可以看到aar文件了 到这里完成百分之99了,这个包已经可以用了 但是还有点瑕疵 继续往下看
在这里插入图片描述

解开aar包

emmmm 一堆看不懂的东西(对于不懂安卓的我来说)
解包的aar

如何去掉这些没用的东西呢?

最好的办法就是删除它们
在生成aar之前把项目中的res下面的东西都删掉
在这里插入图片描述
再次生成aar,再解包 我们得到了干净的aar
包含:
libs中是依赖底下的两个jar包(sdk的jar和unity的classes.jar)
清单文件(androidmanifest.xml)
安卓生成的类文件(classes.jar 包含mainactivity,就是我们写的那个东西)
干净的aar
这里有个重要的操作 删除libs中classes.jar 不然unity生成apk会报错(自己可以试试报错)在这里插入图片描述

接下来就是熟悉的东西了 新建unity项目

在这里插入图片描述
这个东西就是建个按钮用来调用你安卓那边写的LoginQQ方法的,还有个text用来显示登陆成功返回你nickname的

这里代码简单贴一下(重点不在这里就是给个例子)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UnityForAndroid : MonoBehaviour
{
    public Text callbackText;
    public Button LoginBtn;
    // Start is called before the first frame update
    void Start()
    {
        LoginBtn.onClick.AddListener(LoginClick);
    }
    public void LoginClick()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        jo.Call("LoginQQ");
    }
    public void AndroidCallBack(string callbackinfo)
    {
        callbackText.text = callbackinfo;
    }
}

重点来了 !

在Plugins/Android下放一个AndroidManifest文件写成这样 下面有个appid和上面的一样

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qqlogin.loginTest.Login"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="29" />
    <application>
        <activity android:name="com.qqlogin.loginTest.Login.MainActivity" >
            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
        </activity>
      <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="tencent你的AppId" />
        </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" />
    </application>

</manifest>

这里就是一堆sdk要求的权限和拉起的Activity 这样写没毛病 老铁666

这里打包,不多讲,点build都会 等待……Loading……好了

赶紧按到模拟器试一下
内心忐忑图
内心忐忑图
激动图
激动
激动的图 久违的图 欣慰的图 高兴的图
激动的图 久违的图

这里说一下注意点

1.修改安卓项目中build.gradle
2.修改安卓项目中的AndroidManifest
3.在Unity项目中修改AndroidManifest

Unity接入原生QQ登陆到此就完成了
看了这么久 受累了各位
不懂得私聊 谢谢

原创文章 3 获赞 5 访问量 682

猜你喜欢

转载自blog.csdn.net/qq_17583689/article/details/103728495