前期准备

Unity版本:2020.3.34f1c2

unity 实现android service_java

Android Studio版本:4.1.1

unity 实现android service_java_02


classes.jar文件:在你Unity的安装目录下可以找到,路径如下,找不到安装目录的,可以百度搜一下。

C:\Program Files\Unity\Hub\Editor\2020.3.34f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

UnityPlayerActivity.java文件:同上,找不到目录自行搜一下吧。

C:\Program Files\Unity\Hub\Editor\2020.3.34f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

到此前期准备工作基本完成,接下来是使用Android Studio生成arr文件。

一、创建一个Android Studio空工程

unity 实现android service_android_03

unity 实现android service_java_04


unity 实现android service_android studio_05

为了后续方便制作其他arr,这里新建一个Module

unity 实现android service_unity_06

以我的工程为例,右键文件夹UnityCallAndroid,选中new,在选中Module

unity 实现android service_unity_07

选择类型为Android Library,点Next

unity 实现android service_android_08

设置Module name

unity 实现android service_java_09

创建好之后会多一个这个文件夹

unity 实现android service_Android_10

二、导入classes.jar文件和UnityPlayerActivity.java文件

导入classes.jar文件

unity 实现android service_unity_11


unity 实现android service_unity_12


选择你创建的Module,再点击“OK”

unity 实现android service_java_13

导入UnityPlayerActivity.java文件

复制UnityPlayerActivity文件,在工程内选中下图所示文件夹,ctrl+v

unity 实现android service_java_14

还是上述文件夹,右键,创建一个Empty Activity

unity 实现android service_android_15


这里选择默认就行,然后点Finish

unity 实现android service_java_16


打开新创建的MainActivity,修改下图两项操作

unity 实现android service_android_17

修改build.gradle

compileOnly fileTree(includes: ['*.jar'],dir: 'libs')
compileOnly files('libs/classes.jar')

删除dependencies内所有属性,并将上述两行代码粘贴上去,如下图

unity 实现android service_Android_18

修改AndroidManifest.xml

unity 实现android service_unity_19


另外我做了一个安卓机振动的接口测试,所以我在AndroidManifest中添加了一行,如下图:

unity 实现android service_android studio_20

三、开始编写Android端接口并进行aar打包

先编写一个普通方法

源码如下:

package com.clap.unitycallandroid;//包名,这里不用跟着我改,维持自身原有的即可,后面其他的可以直接覆盖

import android.app.Service;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;

import static android.widget.Toast.makeText;

public class MainActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
    public String UnityCallAndroid(String inputStr){
        return "UnityCallAndroid:"+inputStr;
    }
}

再编写一个安卓权限相关的方法

源码如下

package com.clap.unitycallandroid;//包名,这里不用跟着我改,维持自身原有的即可,后面其他的可以直接覆盖

import android.app.Service;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;

import static android.widget.Toast.makeText;

public class MainActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
    public String UnityCallAndroid(String inputStr){
        return "UnityCallAndroid:"+inputStr;
    }

    private Vibrator vibrator;
    public void CallShake(long[] _strength,int _repeat){
        //测试是否调用成功弹窗
        makeText(MainActivity.this,"Unity Call Android", Toast.LENGTH_SHORT).show();
        if (vibrator==null){
            vibrator=(Vibrator) this.getSystemService((Service.VIBRATOR_SERVICE));
        }
        if (vibrator.hasVibrator()){
            vibrator.vibrate(_strength,_repeat);
        }
    }
}

写好之后点击下图所示进行“Make Project”

unity 实现android service_android studio_21

如果出现这个错误,可以按下图流程进行操作,或者将错误信息百度,也能得到答案

unity 实现android service_unity_22


点击File/Project Structure…

unity 实现android service_android studio_23


弹出此面板后,按下图修改数值,手动输入Build Tools Version版本,我这儿使用的是30.0.3

unity 实现android service_Android_24


再重新“Make Project”

成功后这里会多一个build的文件夹

unity 实现android service_unity_25


在这个文件夹下边,找到aar文件,并在文件中查看,如下图所示

unity 实现android service_Android_26


使用压缩工具打开可以看到下图目录,其中classes.jar和AndroidManifest.xml是我们需要的,选中这两项,解压出来。我这里是将其解压到桌面了。

unity 实现android service_android_27


再使用压缩工具打开classes.jar文件,一层一层打开,删除其中的BuildConfig.class文件。

unity 实现android service_unity_28


到这里,Android端的准备工作就做完了。接下来是Unity中的要做的工作了。

四、Unity中的操作

创建新工程,并在Assets目录下边按层级创建下图文件夹

unity 实现android service_Android_29


将刚刚导出classes.jar与AndroidManifest.xml文件复制到上图中Android文件夹下。

修改AndroidManifest.xml

在Unity中使用VS打开AndroidManifest.xml文件,删除下图红框内部分。

unity 实现android service_Android_30

在脚本中调用

源码如下:

using UnityEngine;
using UnityEngine.UI;

public class UnityCallAndroid : MonoBehaviour
{
    public Button shakeBtn;
    public Button callAndroidBtn;
    public Text txt;
    AndroidJavaClass androidClass;
    AndroidJavaObject androidObj;
    private void Start()
    {
        shakeBtn.onClick.AddListener(Shake);
        callAndroidBtn.onClick.AddListener(CallAndroid);
    }
    private void CallAndroid()
    {
        //固定写法
        androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        //实例化AndroidJavaObject
        androidObj = new AndroidJavaObject("com.clap.unitycallandroid.MainActivity");
        string str = androidObj.Call<string>("UnityCallAndroid", "Unity Input");
        txt.text += ("\n" + str);
    }
    private void Shake()
    {
        androidClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        //这里我尝试使用与前一个方法相同实例化操作,
        //但在安卓端测试时,无法正常调用,如果有懂得伙伴,记得评论告诉我一下
        androidObj = androidClass.GetStatic<AndroidJavaObject>("currentActivity");
        long[] strength = new long[] { 0, 15 };
        androidObj.Call("CallShake", strength, -1);
    }
}

Inspector面板赋值

unity 实现android service_android studio_31


注明:测试一定要出apk进行测试,测试一定要出apk进行测试,测试一定要出apk进行测试,重要的事情说三遍。否则是无法正常调用写好的Android接口的。