[Unity]Unity和Android的交互,不继承UnityPlayerActivity

        项目上需要获取CPU型号,但是Unity自身的API接口刚好没有这个功能,只好通过安卓自身的接口来获取。现在很多Unity和安卓的交互都是通过继承UnityPlayerActivity,但是一般这种继承都是用于写SDK的。

        还好有过之前的Unity调用NDK的经验,刚开始转程序的时候,在上海一家公司的实验室里有待过一段时间,刚好处理过类似的。先用AndroidStudio创建一个Library工程。新建一个Java Class,名为api,简单实现了获取cpu信息。

package com.zp.utility;

import android.util.Log;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class api
{
    private static api _instance;
    public static api instance()
    {
        if(null == _instance)
            _instance = new api();
        return _instance;
    }

    public String GetCpuInfo()
    {
        String str1 = "/proc/cpuinfo";
        String str2 = "";

        try {
            FileReader fr = new FileReader(str1);
            BufferedReader br = new BufferedReader(fr);
            while ((str2=br.readLine()) != null) {
                Log.v("ZP", str2);
                if (str2.contains("Hardware")) {
                    return str2.split(":")[1];
                }
            }
            br.close();
        } catch (IOException e) {
        }
        return null;
    }
}

        会用Eclipse生成jar包,但没安装,尴尬了,电脑上只有AndroidStudio,但不知道用AndroidStudio怎么生成jar包,因为一般生成的都是aar包,网上搜到一个方法,还不错,参考了这篇https://blog.csdn.net/u010717701/article/details/80351496,在gradle文件下添加删除jar包代码和生成jar包代码:

        前期工作都完成了,轮到Unity了,其实也很简单,没什么好说的,代码:

public class AndroidUtility
{
    private static AndroidJavaObject _plugin = null;
    private static string cpuInfo;

    public static string GetCpuInfo()
    {
#if UNITY_ANDROID
        if (!string.IsNullOrEmpty(cpuInfo))
            return cpuInfo;

        var javaClass = new AndroidJavaClass("com.zp.utility.api");
        var javaObject = javaClass.CallStatic<AndroidJavaObject>("instance");
        cpuInfo = javaObject.Call<string>("GetCpuInfo");
#endif

        return cpuInfo;
    }

}

        现在就可以测试了。其实有很多安卓插件就是利用这种方式实现的,可以用反编译工具去试下。我为什么知道,是因为我就反编译过某某语音SDK的jar包。

        其实还有一个方法,都不需要写java方法,只是会比较累,比如获取imei,很多人都会去java写个接口,c#调用下,其实可以这样:

    /// <summary>
    /// 获取手机imei
    /// </summary>
    /// <returns></returns>
    public static string GetIMEI()
    {
        var imei = "";
#if UNITY_ANDROID && !UNITY_EDITOR
        var currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaClass contextClass = new AndroidJavaClass("android.content.Context");
        string TELEPHONY_SERVICE = contextClass.GetStatic<string>("TELEPHONY_SERVICE");
        AndroidJavaObject telephonyService = currentActivity.Call<AndroidJavaObject>("getSystemService", TELEPHONY_SERVICE);
        imei = telephonyService.Call<string>("getDeviceId");
#endif
        return imei;
    }

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值