Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用

  一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发。首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对接就好。其次是各种各样的功能需求,例如社交中的语音聊天,我们游戏使用的云娃的SDK,支持语音翻译文字,推送使用的是极光。对接SDK这块说简单吧有时也不简单,需要有一定的java基础和安卓开发基础。说实话我是没有一点安卓开发基础的,大二假期里看了几天java基础从入门到放弃,之后再没碰过java。我对java的了解仅限语法层面,该语言的特性不是很了解。好在对接SDK,他们都提供开发者文档,老老实实一步一步的照着抄就行了。再遇到搞不定的疑难杂症千万不要去钻牛角尖,解决办法有很多.一,找SDk技术支持。二,度娘,谷哥。三,周围的朋友,强大的社区!上来啰嗦了这么多,还不知道楼主到底想干嘛呢?扯远了吧?

  言归正传,虽然我是个游戏开发者但是我对安卓还是比较感兴趣的,自己对sdk这块了解了点,在Unity项目里接过支付宝,微信支付,搞过BmobSMS的SDK做过手机号短信验证,还接过联通SDk的短信道具内购,使用过Mob的shareSDK和ShareRec,朋友项目有个圈子的社交功能,由于用户绑定的是手机号,那么官方推出的免费的MobileAPI就用的上了,做了手机号码归属地的查询。对了,这个项目还有一个第三方登陆的功能,使用Mob的第三方登陆搞定了QQ和微信的一键登录,当时微信登陆没有成功是因为要签名的。在大学期间还做过有米sdk的接入,这些东西也不是游戏必须的一款好的游戏其实完全可以没有这些,这些仅仅是锦上添花罢了。

  今天周末,在家没事,看到了之前玩的小东西,虽然上传到了git,但是还是想写下来。今天这些不是第三方SDK的对接,而是安卓原生本地的一些API的调用。例如:获取手机的硬件信息,在内测时是非常有必要的,在统计游戏的兼容性和机型适配上有很大帮助的,例如这么一个需求,玩家离线挂机获得了很多道具和经验,这时是不是要告诉玩家这些可领取的信息,怎么搞定呢?这是就想到了Jpush了,推送啊!怎么做到,精准推送呢,获取用户的设备唯一标识啊!听说IOS现在比较坑,官方不公开这些信息了,我们可以获取GPU的型号生成Md5什么的,实在不行,我们可以写入本地的一个唯一标识。是不是硬件信息也有很多用呢!游戏过程中我们看不到时间和电量了怎么办,做啊!可以获取到底层的各种信息,显示出来不就行了。那么这些信息如何获取呢???

  1,打开Eclipse建一个安卓库工程,注意是库工程,是Libiary哦!

 

2,继续

3,勾选库工程,继续

4,Icon显示方式选择

5,选择一个空的Activity,在安卓开发里每一个界面默认是一个Activity。在这里我们是调用逻辑代码,不需要GUI,如果想做地图什么的那就需要了。

6,安卓Activity名称,默认,Finish即可。

7,工程建好了,可以开始撸代码了吧? 莫着急,还差一步就可以愉快的撸代码!要做安卓和Unity的交互,安卓又不认识Unity,总得有个介绍人吧!这个介绍人是谁呢?没错,就是你Classes.jar,不管三七二十几,直接拖到工程的Lib下。 

将这个jar文件添加到本工程,以后给Uniiy回掉数据全靠它了啊!

8,准备工作结束,可以贴代码了!

1 1 package com.wuzhang.testandroid; 2 2 3 3 import java.util.ArrayList; 4 4 import java.util.List; 5 5 6 6 import com.unity3d.player.UnityPlayer; 7 7 import com.unity3d.player.UnityPlayerActivity; 8 8 9 9 import android.app.Notification; 10 10 import android.app.NotificationManager; 11 11 import android.app.PendingIntent; 12 12 import android.app.ProgressDialog; 13 13 import android.app.Service; 14 14 import android.appwidget.AppWidgetManager; 15 15 import android.appwidget.AppWidgetProviderInfo; 16 16 import android.content.BroadcastReceiver; 17 17 import android.content.Context; 18 18 import android.content.Intent; 19 19 import android.content.IntentFilter; 20 20 import android.content.pm.ApplicationInfo; 21 21 import android.content.pm.PackageInfo; 22 22 import android.content.pm.PackageManager; 23 23 import android.net.wifi.WifiInfo; 24 24 import android.net.wifi.WifiManager; 25 25 import android.os.BatteryManager; 26 26 import android.os.Bundle; 27 27 import android.os.Handler; 28 28 import android.os.Vibrator; 29 29 import android.telephony.TelephonyManager; 30 30 import android.text.format.Formatter; 31 31 import android.util.Log; 32 32 import android.widget.Toast; 33 33 34 34 public class MainActivity extends UnityPlayerActivity { 35 35 private Vibrator mVibrator01;//声明一个振动器对象 36 36 private static Context instance; 37 37 private String TAG = "log"; 38 38 39 39 @Override 40 40 protected void onCreate(Bundle savedInstanceState) { 41 41 super.onCreate(savedInstanceState); 42 42 instance = getApplicationContext(); 43 43 CreateToast("默认的初始化"); 44 44 45 45 onCoderReturn("pid:"+android.os.Process.myPid() +" "+getBaseContext().getPackageName());//显示进程id和包名 46 46 } 47 47 48 48 public static Context getContext() 49 49 { 50 50 return instance; 51 51 } 52 52 53 53 /* 54 54 * 求和 55 55 */ 56 56 public int Sum(int a,int b) 57 57 { 58 58 int sum = a+b; 59 59 onCoderReturn(String.format("%s + %s = %s", a,b,sum)); 60 60 return sum; 61 61 } 62 62 63 63 /* 64 64 * 震动 65 65 */ 66 66 public void ClickShake() 67 67 { 68 68 mVibrator01 = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE); 69 69 mVibrator01.vibrate(new long[]{100,10,100,1000},-1);//自定义整栋模式,只震动一次 70 70 } 71 71 72 72 /* 73 73 * 状态返回Unity 74 74 */ 75 75 public void onCoderReturn(String state ) 76 76 { 77 77 String gameObjectName = "Main Camera"; 78 78 String methodName = "OnCoderReturn"; 79 79 String arg0 = state; 80 80 UnityPlayer.UnitySendMessage(gameObjectName, methodName, arg0); 81 81 } 82 82 83 83 /***********************调用Android Toast***************************/ 84 84 85 85 /* 86 86 * Unity调用安卓的Toast 87 87 */ 88 88 public void UnityCallAndroidToast(final String toast ) 89 89 { 90 90 runOnUiThread(new Runnable(){ 91 91 @Override 92 92 public void run() { 93 93 //onCoderReturn("Android:UnityCallAndroidToast()"); 94 94 /* 95 95 * 第一个参数:当前上下午的环境。可用getApplicationContext()或this 96 96 * 第二个参数:要显示的字符串 97 97 * 第三个参数:显示时间的长短。Toast有默认的两个LENGTH_SHORT(短)和LENGTH_LONG(长),也可以使用毫秒2000ms 98 98 * */ 99 99 Toast.makeText(MainActivity.this,toast,Toast.LENGTH_SHORT).show(); 100100 } 101101 }); 102102 103103 } 104104 105105 /* 106106 * 创建Toast 107107 */ 108108 public void CreateToast(final String toast) 109109 { 110110 runOnUiThread(new Runnable(){ 111111 @Override 112112 public void run() { 113113 //onCoderReturn("CreateToast()"); 114114 Toast.makeText( 115115 MainActivity.this, 116116 toast,Toast.LENGTH_LONG).show(); 117117 } 118118 }); 119119 } 120120 121121 122122 /*************************************重启应用*************************************/ 123123 124124 /* 125125 * 重新启动应用 126126 */ 127127 public void RestartApplication(){ 128128 CreateToast("应用重启中..."); 129129 130130 Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 131131 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 132132 startActivity(launch); 133133 } 134134 135135 /* 136136 * UI 线程重启应用 137137 */ 138138 public void RestartApplicationOnUIThread(){ 139139 CreateToast("3s后应用重启..."); 140140 new Thread(){ 141141 public void run(){ 142142 Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 143143 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 144144 startActivity(launch); 145145 android.os.Process.killProcess(android.os.Process.myPid()); 146146 onCoderReturn("pid:"+android.os.Process.myPid()); 147147 } 148148 }.start(); 149149 finish(); 150150 } 151151 152152 /* 153153 * 立即重启应用 ok 154154 */ 155155 public void RestartApplication1(){ 156156 new Thread(){ 157157 public void run(){ 158158 Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 159159 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 160160 startActivity(launch); 161161 android.os.Process.killProcess(android.os.Process.myPid()); 162162 } 163163 }.start(); 164164 finish(); 165165 } 166166 167167 /* 168168 * 延迟5s重启应用 ok 169169 */ 170170 public void RestartApplication2(){ 171171 ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); 172172 progressDialog.setMessage("5s后自动重启…"); 173173 progressDialog.show(); 174174 175175 new Handler().postDelayed(new Runnable(){ 176176 public void run() { 177177 Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 178178 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 179179 startActivity(launch); 180180 android.os.Process.killProcess(android.os.Process.myPid()); 181181 } 182182 }, 5000); 183183 } 184184 185185 /************************调用第三方app *****************************/ 186186 187187 public void CallThirdApp(String packageName)//packageName 188188 { 189189 Intent intent = getPackageManager().getLaunchIntentForPackage(packageName); 190190 startActivity(intent); 191191 onCoderReturn(packageName); 192192 } 193193 194194 /* 195195 * 获取所有安装包名和apk名字 196196 */ 197197 public void GetAllPackageName() 198198 { 199199 PackageManager packageManager = null; 200200 packageManager = getPackageManager(); 201201 List<PackageInfo> mAllPackages=new ArrayList<PackageInfo>(); 202202 mAllPackages = packageManager.getInstalledPackages(0); 203203 for(int i = 0; i < mAllPackages.size(); i ++) 204204 { 205205 PackageInfo packageInfo = mAllPackages.get(i); 206206 Log.i("package path", packageInfo.applicationInfo.sourceDir); 207207 Log.i("apk name", (String) packageInfo.applicationInfo.loadLabel(packageManager) ); 208208 onCoderReturn("sourceDir:"+packageInfo.applicationInfo.sourceDir+" apkName:"+packageInfo.applicationInfo.loadLabel(packageManager)); 209209 } 210210 211211 } 212212 213213 /* 214214 * 个人安卓的额第三方App ok 215215 */ 216216 public void GetInstalledPackageName() 217217 { 218218 PackageManager packageManager = null; 219219 packageManager = getPackageManager(); 220220 List<PackageInfo> mAllPackages=new ArrayList<PackageInfo>(); 221221 mAllPackages = packageManager.getInstalledPackages(0); 222222 for(int i = 0; i < mAllPackages.size(); i ++) 223223 { 224224 PackageInfo packageInfo = mAllPackages.get(i); 225225 if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)<= 0) 226226 { 227227 onCoderReturn("apkName:"+packageInfo.applicationInfo.loadLabel(packageManager)+"package path:"+packageInfo.applicationInfo.packageName); 228228 } 229229 else 230230 { 231231 onCoderReturn("sys apkName:"+packageInfo.applicationInfo.loadLabel(packageManager)); 232232 } 233233 } 234234 } 235235 236236 /* 237237 * 获取安装包 238238 */ 239239 public void GetAllWidget() 240240 { 241241 List<AppWidgetProviderInfo> widgetProviderInfos = AppWidgetManager.getInstance(this).getInstalledProviders(); 242242 Log.d("widget", "allWidgetSize = " + widgetProviderInfos.size()); 243243 for (int i = 0; i < widgetProviderInfos.size(); i++) { 244244 AppWidgetProviderInfo info = widgetProviderInfos.get(i); 245245 String packageName = info.provider.getPackageName(); //获取包名 246246 String className = info.provider.getClassName(); //获取类名 247247 Log.d("widget", "packageName: " + packageName); 248248 Log.d("widget", "className: " + className); 249249 onCoderReturn("packageName:"+packageName); 250250 } 251251 } 252252 253253 /**************************安卓本地推送通知***********************************/ 254254 /* 255255 * 安卓本地推送 256256 */ 257257 @SuppressWarnings("deprecation") 258258 public void SendNotification(String title,String content) 259259 { 260260 NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 261261 //1.实例化一个通知,指定图标、概要、时间 262262 Notification n=new Notification(R.drawable.ic_launcher,content,3000); 263263 //2.指定通知的标题、内容和intent 264264 Intent intent = new Intent(this, MainActivity.class); 265265 //设置跳转到的页面 ,时间等内容 266266 PendingIntent pi= PendingIntent.getActivity(this, 0, intent, 1000); 267267 n.setLatestEventInfo(this, title, content, pi); 268268 n.flags |= Notification.FLAG_AUTO_CANCEL; // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。 269269 //3.指定声音 270270 n.defaults = Notification.DEFAULT_SOUND; 271271 n.when = System.currentTimeMillis(); // 立即发生此通知 272272 //4.发送通知 273273 nm.notify(1, n); 274274 } 275275 276276 /**************************************************************/ 277277 /** 278278 * 1.获取手机电池电量 2.检查手机是否充电 279279 * */ 280280 public String MonitorBatteryState() { 281281 UnityCallAndroidToast("获取电池信息中..."); 282282 IntentFilter ifilter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 283283 Intent intent=instance.registerReceiver(null,ifilter); 284284 int rawlevel = intent.getIntExtra("level", 0);//获得当前电量 285285 int scale = intent.getIntExtra("scale", 0);//获得总电量 286286 int status = intent.getIntExtra("status", 0);//电池充电状态 287287 int health = intent.getIntExtra("health", 0);//电池健康状况 288288 int batteryV = intent.getIntExtra("voltage", 0); //电池电压(mv) 289289 int temperature = intent.getIntExtra("temperature", 0); //电池温度(数值) 290290 double T = temperature/10.0; //电池摄氏温度,默认获取的非摄氏温度值,需做一下运算转换 291291 String targetStr=""; 292292 int level = -1; 293293 if (rawlevel > 0 && scale > 0) 294294 { 295295 level = (rawlevel * 100) / scale; 296296 CreateToast("剩余电量:"+level+"%"); 297297 Log.v(TAG,"现在的电量是:"+level+"%" ); 298298 targetStr = level+"|"+scale+"|"+status; 299299 onCoderReturn("当前电量:"+level+"|总容量:"+scale+"|充电状态:"+status+"|电压:"+batteryV+"电池健康状态:"+health+"温度:"+T+" 现在的电量是:"+level+"%"); 300300 UnityPlayer.UnitySendMessage("Main Canera", "OnBatteryDataReturn", targetStr); 301301 } 302302 else 303303 { 304304 onCoderReturn("获取不到电池信息!"); 305305 } 306306 307307 if(health == BatteryManager.BATTERY_HEALTH_GOOD ) 308308 { 309309 Log.v(TAG, "电池状态很好"); 310310 } 311311 if(status==BatteryManager.BATTERY_STATUS_CHARGING)//充电标记2 312312 { 313313 UnityCallAndroidToast("电池充电中..."); 314314 } 315315 else 316316 { 317317 UnityCallAndroidToast("电池放电中..."); 318318 } 319319 //notifyBattery(level,scale,status); 320320 321321 return targetStr ; 322322 } 323323 324324 //获取详细电量信息 返回电量|是否充电中 325325 public String notifyBattery(int level,int scale,int status) 326326 { 327327 String batteryStatue = ""; 328328 int per = scale/5; 329329 if(level<=per) 330330 { 331331 Log.v(TAG, "手机电量低于1/5"); 332332 batteryStatue+= "0.2|"; 333333 } 334334 else if(level>per && level<=per*2) 335335 { 336336 Log.v(TAG, "手机电量低于2/5"); 337337 batteryStatue+= "0.4|"; 338338 } 339339 else if(level>2*per && level<=per*3) 340340 { 341341 Log.v(TAG, "手机电量低于3/5"); 342342 batteryStatue+= "0.6|"; 343343 } 344344 else if(level>3*per && level<=per*4) 345345 { 346346 Log.v(TAG, "手机电量低于4/5"); 347347 batteryStatue+= "0.8|"; 348348 } 349349 else 350350 { 351351 Log.v(TAG, "手机电量充足"); 352352 batteryStatue+= "1|"; 353353 } 354354 if(status==BatteryManager.BATTERY_STATUS_CHARGING)//充电标记2 355355 { 356356 Log.v(TAG,"充电中,电量背景为animation"); 357357 batteryStatue+="2"; 358358 UnityCallAndroidToast("电池充电中..."); 359359 } 360360 else 361361 { 362362 if(status == BatteryManager.BATTERY_STATUS_FULL)//5 363363 { 364364 Log.v(TAG, "满电量"); 365365 CreateToast("电池电量充足"); 366366 } 367367 else if(status == BatteryManager.BATTERY_STATUS_NOT_CHARGING)//4 368368 { 369369 Log.v(TAG,"未充电"); 370370 } 371371 else if(status == BatteryManager.BATTERY_STATUS_DISCHARGING)//3 372372 { 373373 Log.v(TAG,"放电中"); 374374 CreateToast("电池放电中"); 375375 } 376376 if(status == BatteryManager.BATTERY_STATUS_UNKNOWN)//1 377377 { 378378 Log.v(TAG,"状态未知"); 379379 } 380380 batteryStatue+="0"; 381381 } 382382 CreateToast(batteryStatue); 383383 //电量信息格式:剩余百分比|是否充电中 384384 return batteryStatue; 385385 } 386386 387387 //获取wifi信号强度 388388 //wifiinfo.getRssi();获取RSSI,RSSI就是接受信号强度指示。 389389 //这里得到信号强度就靠wifiinfo.getRssi()这个方法。 390390 //得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好, 391391 //-50到-70表示信号偏差,小于-70表示最差, 392392 //有可能连接不上或者掉线,一般Wifi已断则值为-200。 393393 @SuppressWarnings("deprecation") 394394 private String ObtainWifiInfo() { 395395 // Wifi的连接速度及信号强度: 396396 String result=""; 397397 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 398398 WifiInfo info = wifiManager.getConnectionInfo(); 399399 if (info.getBSSID() != null) { 400400 // 链接信号强度 401401 int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5); 402402 // 链接速度 403403 int speed = info.getLinkSpeed(); 404404 // 链接速度单位 405405 String units = WifiInfo.LINK_SPEED_UNITS; 406406 // Wifi源名称 407407 String ssid = info.getSSID(); 408408 int ip = info.getIpAddress(); 409409 String mac = info.getMacAddress(); 410410 result = strength+"|"+intToIp(ip)+"|"+mac+"|"+ssid; 411411 } 412412 UnityPlayer.UnitySendMessage("Main Canera", "OnWifiDataReturn", result); 413413 UnityCallAndroidToast(result); 414414 return result; 415415 } 416416 //转换IP地址 417417 private String intToIp(int paramInt) { 418418 return (paramInt & 0xFF) + "." + (0xFF & paramInt >> 8) + "." + (0xFF & paramInt >> 16) + "." 419419 + (0xFF & paramInt >> 24); 420420 } 421421 /************************检测运营商*******************************/ 422422 /* 423423 * 检测SIM卡类型 424424 */ 425425 public String CheckSIM(){ 426426 String SIMTypeString = ""; 427427 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 428428 String operator = telManager.getSimOperator(); 429429 if (operator != null){ 430430 if (operator.equals("46000") || operator.equals("46002")){ 431431 CreateToast("此卡属于(中国移动)"); 432432 SIMTypeString = "中国移动"; 433433 } else if (operator.equals("46001")){ 434434 CreateToast("此卡属于(中国联通)"); 435435 SIMTypeString = "中国联通"; 436436 437437 } else if (operator.equals("46003")){ 438438 CreateToast("此卡属于(中国电信)"); 439439 SIMTypeString = "中国电信"; 440440 } 441441 } 442442 return SIMTypeString; 443443 } 444444 }

基本上每个功能都有注释,我相信你能看懂得,因为我也是个小菜鸟!接下来导出jar文件,在Unity中测试。

导出时重要的一步,选这几个就可以了!

8,见一个Unity工程,首先建一个Plugins/Android的文件夹,顾名思义,这个文件夹就是存放安卓插件的。将Libs,Res,AndroidMainFest.xml拷贝到该目录下。如下:

9,添加我们的测试代码:

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4 5public class Test : MonoBehaviour 6{  public Text log;  string batteryData; 7  string wifiData; 8 private void OnGUI() 9 { 10 if (GUI.Button(new Rect(10, 10, 140, 40), "发送通知")) 11 { 12 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 13 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 14 jo.Call("UnityCallAndroidToast", "这是Unity调用Android的Toast!"); 15 } 16 17 if (GUI.Button(new Rect(10, 70, 140, 40), "求和")) 18 { 19 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 20 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 21 int sum = jo.Call<int>("Sum",new object[] { 10, 20 }); 22 log.text = ""; 23 jo.Call("ClickShake");//调用安卓震动 24 } 25 26 if (GUI.Button(new Rect(10, 130, 140, 40), "Toast"))//创建安卓 Toast 27 { 28 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 29 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 30 jo.Call("CreateToast","初始化中..."); 31 } 32 33 if (GUI.Button(new Rect(10, 190, 140, 40), "立即重启应用")) 34 { 35 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 36 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 37 jo.Call("RestartApplication"); 38 } 39 40 if (GUI.Button(new Rect(10, 250, 140, 40), "UI线程重启应用")) 41 { 42 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 43 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 44 jo.Call("RestartApplicationOnUIThread"); 45 } 46 47 if (GUI.Button(new Rect(10, 310, 140, 40), "重启应用")) 48 { 49 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 50 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 51 jo.Call("RestartApplication1"); 52 } 53 54 if (GUI.Button(new Rect(10, 370, 140, 40), "5s重启应用")) 55 { 56 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 57 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 58 jo.Call("RestartApplication2"); 59 } 60 61 if (GUI.Button(new Rect(10, 430, 140, 40), "获取安装apk")) 62 { 63 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 64 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 65 jo.Call("GetAllPackageName"); 66 } 67 68 if (GUI.Button(new Rect(10, 490, 140, 40), "调用APP")) 69 { 70 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 71 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 72 jo.Call("CallThirdApp","com.tencent.mm"); 73 } 74 75 if (GUI.Button(new Rect(10, 550, 140, 40), "Unity本地推送")) 76 { 77 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 78 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 79 jo.Call("SendNotification",new string[] {"奇迹:最强者", "勇士们 魔龙讨伐即将开始" }); 80 } 81 82 if (GUI.Button(new Rect(10, 610, 140, 40), "获取所有App")) 83 { 84 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 85 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 86 jo.Call("GetAllWidget"); 87 } 88 89 if (GUI.Button(new Rect(10, 670, 140, 40), "获取已安装的App")) 90 { 91 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 92 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 93 jo.Call("GetInstalledPackageName"); 94 } 95 96 if (GUI.Button(new Rect(10, 730, 140, 40), "获取电池信息")) 97 { 98 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 99 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 100 batteryData = jo.Call<string>("MonitorBatteryState"); 101 OnBatteryDataBack(batteryData); 102 } 103 104 if (GUI.Button(new Rect(10, 790, 140, 40), "获取wifi强度")) 105 { 106 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 107 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 108 wifiData = jo.Call<string>("ObtainWifiInfo"); 109 OnWifiDataBack(wifiData); 110 } 111 if (GUI.Button(new Rect(10, 850, 140, 40), "获取运营商名称")) 112 { 113 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 114 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 115 string simType = jo.Call<string>("CheckSIM"); 116 log.text = simType; 117 } 118 119 if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home)) 120 { 121 Application.Quit(); 122 } 123 124 } 125 126 void GetBatteryAnWifiData() 127 { 128 batteryData = ""; 129 wifiData = ""; 130 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 131 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 132 batteryData = jo.Call<string>("MonitorBatteryState"); 133 log.text = batteryData; 134 AndroidJavaClass jc1 = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 135 AndroidJavaObject jo1 = jc.GetStatic<AndroidJavaObject>("currentActivity"); 136 wifiData = jo1.Call<string>("ObtainWifiInfo"); 137 log.text += wifiData; 138 OnBatteryDataBack(batteryData); 139 OnWifiDataBack(wifiData); 140 } 141 void OnBatteryDataBack(string batteryData)//level+"|"+scale+"|"+status; 142 { 143 string[] args = batteryData.Split('|'); 144 if (args[2] == "2") 145 { 146 log.text += "电池充电中"; 147 } 148 else 149 { 150 log.text += "电池放电中"; 151 } 152 float percent = int.Parse(args[0])/float.Parse(args[1]); 153 log.text += (Mathf.CeilToInt(percent)+"%").ToString(); 154 } 155 void OnWifiDataBack(string wifiData)//strength+"|"+intToIp(ip)+"|"+mac+"|"+ssid; 156 { 157 //分析wifi信号强度 158 //获取RSSI,RSSI就是接受信号强度指示。 159 //得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好, 160 //-50到-70表示信号偏差,小于-70表示最差, 161 //有可能连接不上或者掉线,一般Wifi已断则值为-200。 162 log.text += wifiData; 163 string[] args = wifiData.Split('|'); 164 if (int.Parse(args[0]) > -50 && int.Parse(args[0]) < 0) 165 { 166 log.text += "Wifi信号强度很棒"; 167 } 168 else if (int.Parse(args[0]) > -70 && int.Parse(args[0]) < -50) 169 { 170 log.text += "Wifi信号强度一般"; 171 } 172 else if (int.Parse(args[0]) > -150 && int.Parse(args[0]) < -70) 173 { 174 log.text += "Wifi信号强度很弱"; 175 } 176 else if (int.Parse(args[0]) < -200) 177 { 178 log.text += "Wifi信号JJ了"; 179 } 180 string ip = "IP:" + args[1]; 181 string mac = "MAC:" + args[2]; 182 string ssid = "Wifi Name:" + args[3]; 183 log.text += ip; 184 log.text += mac; 185 log.text += ssid; 186 } 187 188 /// <summary> 189 /// 安卓日志 190 /// </summary> 191 /// <param name="str"></param> 192 void OnCoderReturn(string str) 193 { 194 log.text += str; 195 } 196 197 void OnBatteryDataReturn(string batteryData) 198 { 199 string[] args = batteryData.Split('|'); 200 if (args[2] == "2") 201 { 202 log.text += "电池充电中"; 203 } 204 else 205 { 206 log.text += "电池放电中"; 207 } 208 log.text += (args[0] + "%").ToString(); 209 } 210 211 void OnWifiDataReturn(string wifiData) 212 { 213 log.text += wifiData; 214 string[] args = wifiData.Split('|'); 215 if (int.Parse(args[0]) > -50 && int.Parse(args[0]) <100) 216 { 217 log.text += "Wifi信号强度很棒"; 218 } 219 else if (int.Parse(args[0]) > -70 && int.Parse(args[0]) < -50) 220 { 221 log.text += "Wifi信号强度一般"; 222 } 223 else if (int.Parse(args[0]) > -150 && int.Parse(args[0]) < -70) 224 { 225 log.text += "Wifi信号强度很弱"; 226 } 227 else if (int.Parse(args[0]) < -200) 228 { 229 log.text += "Wifi信号JJ了"; 230 } 231 string ip = "IP:" + args[1]; 232 string mac = "MAC:" + args[2]; 233 string ssid = "Wifi Name:" + args[3]; 234 log.text += ip; 235 log.text += mac; 236 log.text += ssid; 237 } 238}

 过程中会遇到几个问题,获取电量和Wifi信息后我们怎么去取得我们想要的数据,电池相关:

Intent intent=instance.registerReceiver(null,ifilter);  
int rawlevel = intent.getIntExtra("level", 0);//获得当前电量
int scale = intent.getIntExtra("scale", 0);//获得总电量
int status = intent.getIntExtra("status", 0);//电池充电状态
int health = intent.getIntExtra("health", 0);//电池健康状况
int batteryV = intent.getIntExtra("voltage", 0);  //电池电压(mv)   
int temperature = intent.getIntExtra("temperature", 0);  //电池温度(数值)  
double T = temperature/10.0; //电池摄氏温度,默认获取的非摄氏温度值,需做一下运算转换

//分析wifi信号强度

//获取RSSI,RSSI就是接受信号强度指示。

//得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好,

//-50到-70表示信号偏差,小于-70表示最差,

//有可能连接不上或者掉线,一般Wifi已断则值为-200。

这些度娘都知道,如果数据还不够,自己去查API了啊!

打包后,真机测试,看看效果图:

 

 

Android 工程:git@git.oschina.net:wuzhang/TestAndroid.git
Unity工程:git@git.oschina.net:wuzhang/UnityCallAndroidAPI.git如果你觉得有什么问题,大家共同交流,一起学习,以后有时间把第三方SDK的对接及合并写一些。

点赞
收藏

评论区

加载中...

相关推荐

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

Unity2D游戏开发快速入门第1章创建一个简单的2D游戏即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的。实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了。例如,提供了一些专用于开发2D游戏的Unit

ENTBOOST 2014.180L发布,开源企业IM免费企业即时通讯

ENTBOOST,VERSION2014.180Linux版本发布,主要增加企业IM应用集成功能,完善安卓SDK功能及部分BUG修正;7/1(明天)发布Windows版本,敬请关注!ENTBOOST是跨平台、跨应用的实时通讯平台;恩布网络致力于帮助开发者、软件公司和企业,组建企业级的即时通讯平台和运营平台;提供跨终端、跨应用的实时

unity调用移动端相册并且裁剪图片

最近有个需求需要从手机上获取相册图片,并且需要传回到Unity中,经过几天的开发终于完成,以下为开发的记录:工具版本Unity5.6安卓AndroidStudio3.0 Unity导出Gradle项目使用gradle:2.3.3compileSdkVe

umeng push dex class conflict with alipay lib jar

友盟推送SDK为了提高设备标识的唯一性,除了UMID之外,还用到了Taobao提供的一个设备标识生成库(UTDID.jar)做双向保证。当前推送SDK兼容的UDID版本是V1.1.0。淘宝提供的设备标识生成库(UTDID.jar)已经广泛应用在阿里系的App中了,包括支付宝。部分集成过支付宝SDK的App,在集成友盟推送SDK的时候,会存在包冲突的问题

Android推送——百度慧推入门篇

推荐Android开发者将现有项目迁移到AndroidStudio环境,并在AndroidStudio下更快地实现SDK的集成工作。本文档介绍AndroidStudio和Eclipse开发环境下导入SDK资源进行集成的步骤,需要仔细阅读文档和Demo工程。1、登录百度慧推,点击创建应用使用带有签名的apk包上传创建应用;!(

Android如何调用so文件

前言小编对接的安卓测试项目团队中有部分团队使用C开发项目代码,出于好奇去学习了解了一下在安卓项目中集成C代码的方法,下面和大家分享一下。在安卓开发中经常会遇到需要通过java调用其它语言编写的代码的情况,这主要是由于以下几方面的原因:1.运行效率高:在高性能要求的需求中,使用