IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android Studio 导出Unity插件(剩余电量、信号强度)

    u010019717发表于 2016-09-11 23:29:52
    love 0

    孙广东  2016.9.11

    http://blog.csdn.net/u010019717


            因为游戏时全屏的 , 所以需要游戏能更加的人性化提示一些信息在界面上。

                            保卫萝卜3的截图!

    http://blog.csdn.net/u010019717


    首先使用  AB工具导出 .jar  包 之前说过:  http://blog.csdn.net/u010019717/article/details/51762010


    电量相关:

    packagecom.example.asgardgame.androidnative;
    
    importandroid.os.BatteryManager;
    
    importandroid.content.Context;
    importandroid.content.Intent;
    importandroid.app.Activity;
    importandroid.content.IntentFilter;
    
    importcom.unity3d.player.UnityPlayer;
    
    publicclassGetBattery{
    
    //状态:是说,满电、正在充电,正在使用等
    publicstaticintBatteryState(){
    finalActivityactivity=UnityPlayer.currentActivity;
    finalContextcontext=activity.getApplicationContext();
    
    IntentFilterifilter=newIntentFilter(Intent.ACTION_BATTERY_CHANGED);
    IntentbatteryStatus=context.registerReceiver(null,ifilter);
    
    intstatus=batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
    intnowState=-1;
    
    switch(status){
    caseBatteryManager.BATTERY_STATUS_FULL:
    //Full
    nowState=2;
    break;
    caseBatteryManager.BATTERY_STATUS_CHARGING:
    //Charging
    nowState=1;
    break;
    caseBatteryManager.BATTERY_STATUS_DISCHARGING:
    //Unplugged
    nowState=0;
    break;
    caseBatteryManager.BATTERY_STATUS_NOT_CHARGING:
    //Unplugged
    nowState=0;
    break;
    caseBatteryManager.BATTERY_STATUS_UNKNOWN:
    //Unknown
    nowState=-1;
    break;
    }
    
    returnnowState;
    }
    
    //剩余电量,满电是100
    publicstaticintBatteryLevel(){
    finalActivityactivity=UnityPlayer.currentActivity;
    finalContextcontext=activity.getApplicationContext();
    
    IntentFilterifilter=newIntentFilter(Intent.ACTION_BATTERY_CHANGED);
    IntentbatteryStatus=context.registerReceiver(null,ifilter);
    
    intnowLevel=batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL,-1);
    
    returnnowLevel;
    }
    
    }
    

    还没完,  需要权限:  AndroidManifest.xml

    <manifestxmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.asgardgame.androidnative">

     

    <application

    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:theme="@style/AppTheme">

     

    </application>

     

    <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

     

    </manifest>



    手机信号相关:

    packagecom.example.asgardgame.androidnative;
    
    importandroid.annotation.TargetApi;
    importandroid.app.Activity;
    importandroid.content.Context;
    importandroid.net.wifi.WifiInfo;
    importandroid.net.wifi.WifiManager;
    importandroid.os.Build;
    importandroid.telephony.CellInfo;
    importandroid.telephony.CellInfoCdma;
    importandroid.telephony.CellInfoGsm;
    importandroid.telephony.CellInfoLte;
    importandroid.telephony.CellInfoWcdma;
    importandroid.telephony.CellSignalStrength;
    importandroid.telephony.CellSignalStrengthCdma;
    importandroid.telephony.CellSignalStrengthGsm;
    importandroid.telephony.CellSignalStrengthLte;
    importandroid.telephony.TelephonyManager;
    
    importcom.unity3d.player.UnityPlayer;
    
    publicclassGetWIFIRssi{
    
    
    publicstaticintGetWIFISignalStrength(){
    finalActivityactivity=UnityPlayer.currentActivity;
    finalContextcontext=activity.getApplicationContext();
    
    //得到的值是一个0到-100的区间值,是一个int型数据,
    //其中0到-50表示信号最好,
    //-50到-70表示信号偏差,
    //小于-70表示最差,有可能连接不上或者掉线。
    //这个函数是返回5个级别!!!!!!
    WifiManagerwifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    intnumberOfLevels=5;
    WifiInfowifiInfo=wifiManager.getConnectionInfo();
    intlevel=WifiManager.calculateSignalLevel(wifiInfo.getRssi(),numberOfLevels);
    
    returnlevel;
    }
    
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    publicstaticintGetTeleSignalStrength()
    {
    finalActivityactivity=UnityPlayer.currentActivity;
    finalContextcontext=activity.getApplicationContext();
    
    intlevel=0;
    
    finalTelephonyManagertm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    for(finalCellInfoinfo:tm.getAllCellInfo())
    {
    if(infoinstanceofCellInfoGsm){
    finalCellSignalStrengthGsmgsm=((CellInfoGsm)info).getCellSignalStrength();
    level=gsm.getLevel();
    }elseif(infoinstanceofCellInfoCdma){
    finalCellSignalStrengthCdmacdma=((CellInfoCdma)info).getCellSignalStrength();
    level=cdma.getLevel();
    }elseif(infoinstanceofCellInfoLte){
    finalCellSignalStrengthLtelte=((CellInfoLte)info).getCellSignalStrength();
    level=lte.getLevel();
    }elseif(infoinstanceofCellInfoWcdma){
    finalCellSignalStrengthwcdma=((CellInfoWcdma)info).getCellSignalStrength();
    level=wcdma.getLevel();
    }
    }
    
    returnlevel;
    }
    
    }
    
    


    导出  .jar   包之后的处理  在Unity中的处理:

    注:  (我并没回去到实际自己想要的效果  和 手机上显示的不同)

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class AndroidNative : MonoBehaviour
    {
    
        public Slider _slider;
        public Text _butterryLevel;
        public Text _signalStrength;
        // Use this for initialization
        void Start()
        {
            // 开启协程 并保持更新
            InvokeRepeating("UpdateUI", 1, 10f);
        }
    
        void UpdateUI()
        {
    
    #if !UNITY_EDITOR && UNITY_ANDROID
            // 电量相关的设置
            _butterryLevel.text = "电量级别:" + BatteryState() + "电量:" + BatteryLevel();
            _slider.value = BatteryLevel() *1f/100;
    
    
            if (Application.internetReachability== NetworkReachability.NotReachable)              
            { 
                _signalStrength.text = "没有任何可用的网络!";
            }    
            
            //当用户使用WiFi时  
            else if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork)               
            { 
                var value = GetWIFISignalStrength();
                _signalStrength.text = "wifi:" + value + "格子数: " + value;
            }                         
    
            //当用户使用移动网络时  
            else if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)             
            {
                var value = GetTeleSignalStrength();
                _signalStrength.text = "信号:" + value + "格子数: " + GetSignalLevel(value);               
            }
    
    #endif
        }
    
        /// <summary>
        /// 返回应该显示的格子数(共5个)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private int GetSignalLevel(int value)
        {
            //1、当信号大于等于 - 85dBm时候,信号显示满格
            //2、当信号大于等于 - 95dBm时候,而小于 - 85dBm时,信号显示4格
            //3、当信号大于等于 - 105dBm时候,而小于 - 95dBm时,信号显示3格,不好捕捉到。
            //4、当信号大于等于 - 115dBm时候,而小于 - 105dBm时,信号显示2格,不好捕捉到。
            //5、当信号大于等于 - 140dBm时候,而小于 - 115dBm时,信号显示1格,不好捕捉到。
            if (value > -85)
            {
                return 5;
            }
            else if (value< -85 && value > -95)
            {
                return 4;
            }
            else if (value < -95 && value > -105)
            {
                return 3;
            }
            else if (value < -105 && value > -115)
            {
                return 2;
            }
            else if (value < -115 && value > -140)
            {
                return 1;
            }
                  
            return -1;
        }
    
        public static int CallStatic(string className, string methodName, params object[] args)
        {
    #if UNITY_ANDROID && !UNITY_EDITOR
            try
            {
                string CLASS_NAME = "com.example.asgardgame.androidnative.GetBattery";     //  package.classname
                AndroidJavaObject bridge = new AndroidJavaObject(CLASS_NAME);
    
                int value = bridge.CallStatic<int>(methodName, args);
                return value;
    
            } 
            catch (System.Exception ex)
            {
                Debug.LogWarning(ex.Message);
            }
    
    
    #endif
            return -1;
        }
    
    
        // 返回状态   是枚举-1,0,1,2   如下面
        public static int BatteryState()
        {
            return CallStatic("GetBattery", "BatteryState");
        }
    
        /*
                   switch (status) {
                case BatteryManager.BATTERY_STATUS_FULL:      // 满电
                    // Full
                    nowState = 2;
                    break;
                case BatteryManager.BATTERY_STATUS_CHARGING:      // 正在充电
                    // Charging
                    nowState = 1;
                    break;
                case BatteryManager.BATTERY_STATUS_DISCHARGING:
                    // Unplugged
                    nowState = 0;
                    break;
                case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                    // Unplugged
                    nowState = 0;
                    break;
                case BatteryManager.BATTERY_STATUS_UNKNOWN:
                    // Unknown
                    nowState = -1;
                    break;
            }
         */
    
        // 返回剩余电量,  满电是100
        public static int BatteryLevel()
        {
            return CallStatic("GetBattery", "BatteryLevel");
        }
    
        // 返回WIFI      返回的是负值  越靠近0 越强
        public static int GetWIFISignalStrength()
        {
            return CallStatic("GetWIFIRssi", "GetWIFISignalStrength");
        }
    
        // 返回Telephone
        public static int GetTeleSignalStrength()
        {
            return CallStatic("GetWIFIRssi", "GetTeleSignalStrength");
        }
    }
    




    http://blog.csdn.net/u010019717

    闲来无事,  多附一张图吧! (安卓知识体系图)



沪ICP备19023445号-2号
友情链接