专栏首页韩东吉的Unity杂货铺零基础入门 30:获取移动端手机的电量/时间/网络

零基础入门 30:获取移动端手机的电量/时间/网络

大家在玩手游的时候经常会看到游戏里有一些提醒状态,图示如下,右上角有当前手机端的时间,wifi网络状态展示,以及电量的展示效果

对于时间的展示,实际就是拿到手机上的时间以字符串的形式显示出来即可。

对于中间的Wifi网络的贴图展示,也是拿到了当前的网络数据类型,移动端还是wifi网络,对不同的图片进行展示。

而最后的电量的格子,实现的原理则是拿到当前手机端的电量,根据不同的电量设置内部格子贴图的FillAmount即可,当FillAmount为1的时候格子填充满。也可以根据不同的电量区间比设置格子成不同的颜色。比如百分之60以上内部的格子贴图为绿色,30-60的区间格子为黄色,1-30的区间格子为红色,这样就很像我们手机端的真是电量展示了。

所以以上的关键点就在于如何拿到手机上的时间,电量,以及网络状态类型。

接下来正题开始


想要拿到ios和安卓两个平台的手机时间,是一个很容易的事。

这里我直接把代码贴出来,方便大家使用,下面的代码双平台均可使用获取时间。

///获取手机时间

IEnumerator UpdataTime()

{

DateTime now = DateTime.Now;

if(now.Hour < 10 && now.Minute>= 10)

{

m_time = string.Format("0{0}:{1}", now.Hour, now.Minute);

}

else if(now.Hour < 10 && now.Minute < 10)

{

m_time = string.Format("0{0}:0{1}", now.Hour, now.Minute);

}

else if(now.Hour >= 10 && now.Minute < 10)

{

m_time = string.Format("{0}:0{1}", now.Hour, now.Minute);

}

else

{

m_time = string.Format("{0}:{1}", now.Hour, now.Minute);

}

//设置组件文本的显示内容为当前的手机时间

m_phoneTimeText.text = m_time;

yield return new WaitForSeconds(60f - now.Second);

while (true)

{

now = DateTime.Now;

if(now.Hour < 10 && now.Minute>= 10)

{

m_time = string.Format("0{0}:{1}", now.Hour, now.Minute);

}

else if(now.Hour < 10 && now.Minute < 10)

{

m_time = string.Format("0{0}:0{1}", now.Hour, now.Minute);

}

else if(now.Hour >= 10 && now.Minute < 10)

{

m_time = string.Format("{0}:0{1}", now.Hour, now.Minute);

}

else

{

m_time = string.Format("{0}:{1}", now.Hour, now.Minute);

}

//设置组件文本的显示内容为当前的手机时间

m_phoneTimeText.text = m_time;

yield return new WaitForSeconds(60f);

}

}

上面的接口通过下面的方式调用即可。

void Start ()

{

//更新手机时间

StartCoroutine("UpdataTime");

}

以上是获取移动端手机时间的方法,接下来介绍下获取网络类型

如果下面类型为真,则代表当前网络类型为Wifi

Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork

如果下面类型为真,代表当前网络类型为移动数据

Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork

如果下面类型为真,代表当前无网络

Application.internetReachability == NetworkReachability.NotReachable

上面就是获取手机端网络类型的方法,可以根据不同的网络类型显示不同的资源图。移动端ios和android平台都可以使用这个方式。

接下来就是最后一个知识点,也就是获取移动端手机电量的方法,对于不同的平台,安卓和ios获取手机电量的方式就不太相同了,需要各自封装自己的方法才可以实现。

对于安卓来说,可以通过下面的方式进行获取。

///获取安卓手机电池电量

private int GetAndroidBatteryNum()

{

if (Application.platform == RuntimePlatform.Android)

{

try

{

using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))

{

if (null != unityPlayer)

{

using (AndroidJavaObject currActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))

{

if (null != currActivity)

{

using (AndroidJavaObject intentFilter = new AndroidJavaObject("android.content.IntentFilter", new object[]{ "android.intent.action.BATTERY_CHANGED" }))

{

using (AndroidJavaObject batteryIntent = currActivity.Call<AndroidJavaObject>("registerReceiver", new object[]{null,intentFilter}))

{

int level = batteryIntent.Call<int>("getIntExtra", new object[]{"level",-1});

int scale = batteryIntent.Call<int>("getIntExtra", new object[]{"scale",-1});

if (level == -1 || scale == -1)

{

return 50;

}

return (int)(((float)level / (float)scale) * 100.0f);

}

}

}

}

}

}

}

catch (System.Exception ex)

{

}

}

return 100;

}

获取安卓上的手机电量大家只需要调用该接口即可。

网上还有其他的教程,通过路径的形式获取电量,我也试过下面的方式,但是并不推荐

此方式只能取出部分安卓手机端电量

try

{

string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/capacity");

return int.Parse(CapacityString);

}

catch (Exception e)

{

LogManager.Log("Failed to read battery power; " + e.Message);

}

return -1;

但是此方法只能取出部分安卓手机端电量,因为通过路径文件的方式获取电量并不是所有的安卓系统都是一样的路径,所以有的可以取出有的则不行,所以不推荐上面的方法

对于ios平台来说,和我们之前分享过的一篇手机端关闭程序的思维是一样的,既然需要依赖于ios底层代码去获取电量,就一定需要外部函数extern来实现这个功能,然后在C#调用ios的原生逻辑。

我先把C#内的代码写出来,如下

///获取ios端手机电量

[ DllImport( "__Internal" )]

private static extern float GetiOSBatteryLevel();

然后在项目的Plugins\iOS文件夹中,增加一个新的文件,名为GetiPhoneBattery.mm

然后下面是.mm文件的内部代码逻辑,用来获取移动端ios平台手机电量

extern "C"

{

float GetiOSBatteryLevel()

{

[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];

return [[UIDevice currentDevice] batteryLevel];

}

}

好了,是不是很简单呢?

以上就是在移动端获取手机上电量、时间、网络状态的方法,已经都分享给大家了。

马上就要十月一了,希望大家愉快的度过假期,提前祝大家十一快乐哈。

(*^‧^*)

下期分享见咯

本文分享自微信公众号 - 韩东吉的Unity杂货铺(DeveloperJimin),作者:Jimin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从象棋到太极,领悟学习之道(前言)

    不知道有多少人了解过维茨金,也不知道有多少人看过他写的书。先借鉴网上对维茨金的个人描述,让大家先有个了解。

    韩东吉
  • 零基础入门 22: UGUI Panel

    今天要给大家分享的。。。可谓是,非常的简单啊,我甚至都在考虑要不要单独抽出一次当做分享内容 (・-・*),也有可能是我所有分享里文字数目最少的

    韩东吉
  • 零基础入门 6: 菜单介绍

    每个月总要忙那么一段时间,因为之前的存稿保持在日更,导致后续忙起来没有时间来得及写新的内容,就一直没有更新。今天趁着午休来更新一篇。主要说下Unity里复杂的菜...

    韩东吉
  • P1996 约瑟夫问题

    题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出...

    attack
  • javascript_data

    机器学习和大数据挖掘
  • 1512 转向游戏

    1512 转向游戏 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 小明自认为...

    attack
  • 23:二维数组回形遍历

    23:二维数组回形遍历 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个row行col列的整数数组array,要求从array[0][0...

    attack
  • 【HDU 6171】Admiral(搜索+剪枝)

    目标状态是第i行有i+1个i数字(i=0~5)共6行。给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个。求20步以内到目标状态的最少步数是多少。

    饶文津
  • 二叉搜索树

    二叉搜索树(Binary Search Tree)的定义: 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它...

    指点
  • python基础----装饰器

    代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),本质上是一个返回函数的高阶数 一个简单例子 假设我们现在有个函数是这样的: def no...

    GavinZhou

扫码关注云+社区

领取腾讯云代金券