前言
我是做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 新建安卓工程
修改工程文件用来生成aar
打开project目录
将下载好的SDK中的jar包和Unity目录下的classes.jar放入libs文件夹下
将导入的两个包作为一个库用
点完 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之前把项目中的res下面的东西都删掉
再次生成aar,再解包 我们得到了干净的aar
包含:
libs中是依赖底下的两个jar包(sdk的jar和unity的classes.jar)
清单文件(androidmanifest.xml)
安卓生成的类文件(classes.jar 包含mainactivity,就是我们写的那个东西)
这里有个重要的操作 删除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登陆到此就完成了
看了这么久 受累了各位
不懂得私聊 谢谢