您的位置:首頁>正文

Unity獲取安卓手機運營商,電量,wifi信號強度,本地Toast,獲取已安裝apk,調用協力廠商應用,強制自動重啟本應用

一個完整的遊戲專案上線需要不斷的完善優化, 但是到了後期的開發不再僅僅是遊戲了, 它的複雜度遠遠大於純粹的應用開發。 首先必須要考慮的就是集成協力廠商SDK, 支付這塊管道商已經幫你我們做好了, 只需要按照文檔對接就好。 其次是各種各樣的功能需求, 例如社交中的語音聊天, 我們遊戲使用的雲娃的SDK,支援語音翻譯文字, 推送使用的是極光。 對接SDK這塊說簡單吧有時也不簡單, 需要有一定的java基礎和安卓開發基礎。 說實話我是沒有一點安卓開發基礎的, 大二假期裡看了幾天java基礎從入門到放棄,

之後再沒碰過java。 我對java的瞭解僅限語法層面, 該語言的特性不是很瞭解。 好在對接SDK, 他們都提供開發者文檔, 老老實實一步一步的照著抄就行了。 再遇到搞不定的疑難雜症千萬不要去鑽牛角尖, 解決辦法有很多.一, 找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回掉資料全靠它了啊!

1 package com.wuzhang.testandroid; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.unity3d.player.UnityPlayer; 7 import com.unity3d.player.UnityPlayerActivity; 8 9 import android.app.Notification; 10 import android.app.NotificationManager; 11 import android.app.PendingIntent; 12 import android.app.ProgressDialog; 13 import android.app.Service; 14 import android.appwidget.AppWidgetManager; 15 import android.appwidget.AppWidgetProviderInfo; 16 import android.content.BroadcastReceiver; 17 import android.content.Context; 18 import android.content.Intent; 19 import android.content.IntentFilter; 20 import android.content.pm.ApplicationInfo; 21 import android.content.pm.PackageInfo; 22 import android.content.pm.PackageManager; 23 import android.net.wifi.WifiInfo; 24 import android.net.wifi.WifiManager; 25 import android.os.BatteryManager; 26 import android.os.Bundle; 27 import android.os.Handler; 28 import android.os.Vibrator; 29 import android.telephony.TelephonyManager; 30 import android.text.format.Formatter; 31 import android.util.Log; 32 import android.widget.Toast; 33 34 public class MainActivity extends UnityPlayerActivity { 35 private Vibrator mVibrator01;//聲明一個振動器物件 36 private static Context instance; 37 private String TAG = "log"; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 instance = getApplicationContext; 43 CreateToast("默認的初始化"); 44 45 onCoderReturn("pid:"+android.os.Process.myPid +" "+getBaseContext.getPackageName);//顯示進程id和包名 46 } 47 48 public static Context getContext 49 { 50 return instance; 51 } 52 53 /* 54 * 求和 55 */ 56 public int Sum(int a,int b) 57 { 58 int sum = a+b; 59 onCoderReturn(String.format("%s + %s = %s", a,b,sum)); 60 return sum; 61 } 62 63 /* 64 * 震動 65 */ 66 public void ClickShake 67 { 68 mVibrator01 = (Vibrator)getApplication.getSystemService(Service.VIBRATOR_SERVICE); 69 mVibrator01.vibrate(new long[]{100,10,100,1000},-1);//自訂整棟模式,只震動一次 70 } 71 72 /* 73 * 狀態返回Unity 74 */ 75 public void onCoderReturn(String state ) 76 { 77 String gameObjectName = "Main Camera"; 78 String methodName = "OnCoderReturn"; 79 String arg0 = state; 80 UnityPlayer.UnitySendMessage(gameObjectName, methodName, arg0); 81 } 82 83 /***********************調用Android Toast***************************/ 84 85 /* 86 * Unity調用安卓的Toast 87 */ 88 public void UnityCallAndroidToast(final String toast ) 89 { 90 runOnUiThread(new Runnable{ 91 @Override 92 public void run { 93 //onCoderReturn("Android:UnityCallAndroidToast"); 94 /* 95 * 第一個參數:當前上下午的環境。可用getApplicationContext或this 96 * 第二個參數:要顯示的字串 97 * 第三個參數:顯示時間的長短。Toast有默認的兩個LENGTH_SHORT(短)和LENGTH_LONG(長),也可以使用毫秒2000ms 98 * */ 99 Toast.makeText(MainActivity.this,toast,Toast.LENGTH_SHORT).show; 100 } 101 }); 102 103 } 104 105 /* 106 * 創建Toast 107 */ 108 public void CreateToast(final String toast) 109 { 110 runOnUiThread(new Runnable{ 111 @Override 112 public void run { 113 //onCoderReturn("CreateToast"); 114 Toast.makeText( 115 MainActivity.this, 116 toast,Toast.LENGTH_LONG).show; 117 } 118 }); 119 } 120 121 122 /*************************************重啟應用*************************************/ 123 124 /* 125 * 重新啟動應用 126 */ 127 public void RestartApplication{ 128 CreateToast("應用重啟中..."); 129 130 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 131 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 132 startActivity(launch); 133 } 134 135 /* 136 * UI 執行緒重啟應用 137 */ 138 public void RestartApplicationOnUIThread{ 139 CreateToast("3s後應用重啟..."); 140 new Thread{ 141 public void run{ 142 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 143 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 144 startActivity(launch); 145 android.os.Process.killProcess(android.os.Process.myPid); 146 onCoderReturn("pid:"+android.os.Process.myPid); 147 } 148 }.start; 149 finish; 150 } 151 152 /* 153 * 立即重啟應用 ok 154 */ 155 public void RestartApplication1{ 156 new Thread{ 157 public void run{ 158 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 159 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 160 startActivity(launch); 161 android.os.Process.killProcess(android.os.Process.myPid); 162 } 163 }.start; 164 finish; 165 } 166 167 /* 168 * 延遲5s重啟應用 ok 169 */ 170 public void RestartApplication2{ 171 ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); 172 progressDialog.setMessage("5s後自動重啟…"); 173 progressDialog.show; 174 175 new Handler.postDelayed(new Runnable{ 176 public void run { 177 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 178 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 179 startActivity(launch); 180 android.os.Process.killProcess(android.os.Process.myPid); 181 } 182 }, 5000); 183 } 184 185 /************************調用協力廠商app *****************************/ 186 187 public void CallThirdApp(String packageName)//packageName 188 { 189 Intent intent = getPackageManager.getLaunchIntentForPackage(packageName); 190 startActivity(intent); 191 onCoderReturn(packageName); 192 } 193 194 /* 195 * 獲取所有安裝包名和apk名字 196 */ 197 public void GetAllPackageName 198 { 199 PackageManager packageManager = null; 200 packageManager = getPackageManager; 201 List mAllPackages=new ArrayList; 202 mAllPackages = packageManager.getInstalledPackages(0); 203 for(int i = 0; i < mallpackages.size;="" i="" ++)="" 204="" {="" 205="" packageinfo="" packageinfo="mAllPackages.get(i);" 206="" log.i("package="" path",="" packageinfo.applicationinfo.sourcedir);="" 207="" log.i("apk="" name",="" (string)="" packageinfo.applicationinfo.loadlabel(packagemanager)="" );="" 208="" oncoderreturn("sourcedir:"+packageinfo.applicationinfo.sourcedir+"="" apkname:"+packageinfo.applicationinfo.loadlabel(packagemanager));="" 209="" }="" 210="" 211="" }="" 212="" 213="" 214="" *="" 個人安卓的額協力廠商app="" ok="" 215="" */="" 216="" public="" void="" getinstalledpackagename="" 217="" {="" 218="" packagemanager="" packagemanager="null;" 219="" packagemanager="getPackageManager;" 220="" list="" mallpackages="new" arraylist;="" 221="" mallpackages="packageManager.getInstalledPackages(0);" 222="" for(int="" i="0;" i="" widgetproviderinfos="AppWidgetManager.getInstance(this).getInstalledProviders;" 242="" log.d("widget",="" "allwidgetsize=" + widgetProviderInfos.size); 243 for (int i = 0; i 0 && scale > 0) 294 { 295 level = (rawlevel * 100) / scale; 296 CreateToast(" 剩餘電量:"+level+"%");="" 297="" log.v(tag,"現在的電量是:"+level+"%"="" );="" 298="" targetstr="level+"|"+scale+"|"+status;" 299="" oncoderreturn("當前電量:"+level+"|總容量:"+scale+"|充電狀態:"+status+"|電壓:"+batteryv+"電池健康狀態:"+health+"溫度:"+t+"="" 現在的電量是:"+level+"%");="" 300="" unityplayer.unitysendmessage("main="" canera",="" "onbatterydatareturn",="" targetstr);="" 301="" }="" 302="" else="" 303="" {="" 304="" oncoderreturn("獲取不到電池資訊!");="" 305="" }="" 306="" 307="" if(health="=" batterymanager.battery_health_good="" )="" 308="" {="" 309="" log.v(tag,="" "電池狀態很好");="" 310="" }="" 311="" if(status="=BatteryManager.BATTERY_STATUS_CHARGING)//充電標記2" 312="" {="" 313="" unitycallandroidtoast("電池充電中...");="" 314="" }="" 315="" else="" 316="" {="" 317="" unitycallandroidtoast("電池放電中...");="" 318="" }="" 319="" notifybattery(level,scale,status);="" 320="" 321="" return="" targetstr="" ;="" 322="" }="" 323="" 324="" 獲取詳細電量資訊="" 返回電量|是否充電中="" 325="" public="" string="" notifybattery(int="" level,int="" scale,int="" status)="" 326="" {="" 327="" string="" batterystatue="" ;="" 328="" int="" per="scale/5;" 329="" if(levelper="" &&="" level2*per="" &&="" level3*per="" &&="" level=""> 8) + "." + (0xFF & paramInt >> 16) + "." 419 + (0xFF & paramInt >> 24); 420 } 421 /************************檢測運營商*******************************/ 422 /* 423 * 檢測SIM卡類型 424 */ 425 public String CheckSIM{ 426 String SIMTypeString = ""; 427 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 428 String operator = telManager.getSimOperator; 429 if (operator != null){ 430 if (operator.equals("46000") || operator.equals("46002")){ 431 CreateToast("此卡屬於(中國移動)"); 432 SIMTypeString = "中國移動"; 433 } else if (operator.equals("46001")){ 434 CreateToast("此卡屬於(中國聯通)"); 435 SIMTypeString = "中國聯通"; 436 437 } else if (operator.equals("46003")){ 438 CreateToast("此卡屬於(中國電信)"); 439 SIMTypeString = "中國電信"; 440 } 441 } 442 return SIMTypeString; 443 } 444 }

基本上每個功能都有注釋,我相信你能看懂得,因為我也是個小菜鳥!接下來匯出jar檔,在Unity中測試。

匯出時重要的一步,選這幾個就可以了!

8,見一個Unity工程,首先建一個Plugins/Android的資料夾,顧名思義,這個資料夾就是存放安卓外掛程式的。將Libs,Res,AndroidMainFest.xml拷貝到該目錄下。如下:

using UnityEngine; using System.Collections; using UnityEngine.UI; public class Test : MonoBehaviour {

過程中會遇到幾個問題,獲取電量和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.gitUnity工程:git@git.oschina.net:wuzhang/UnityCallAndroidAPI.git如果你覺得有什麼問題,大家共同交流,一起學習,以後有時間把協力廠商SDK的對接及合併寫一些。

6,安卓Activity名稱,默認,Finish即可。

7,工程建好了,可以開始擼代碼了吧? 莫著急,還差一步就可以愉快的擼代碼!要做安卓和Unity的交互,安卓又不認識Unity,總得有個介紹人吧!這個介紹人是誰呢?沒錯,就是你Classes.jar,不管三七二十幾,直接拖到工程的Lib下。

將這個jar檔添加到本工程,以後給Uniiy回掉資料全靠它了啊!

1 package com.wuzhang.testandroid; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.unity3d.player.UnityPlayer; 7 import com.unity3d.player.UnityPlayerActivity; 8 9 import android.app.Notification; 10 import android.app.NotificationManager; 11 import android.app.PendingIntent; 12 import android.app.ProgressDialog; 13 import android.app.Service; 14 import android.appwidget.AppWidgetManager; 15 import android.appwidget.AppWidgetProviderInfo; 16 import android.content.BroadcastReceiver; 17 import android.content.Context; 18 import android.content.Intent; 19 import android.content.IntentFilter; 20 import android.content.pm.ApplicationInfo; 21 import android.content.pm.PackageInfo; 22 import android.content.pm.PackageManager; 23 import android.net.wifi.WifiInfo; 24 import android.net.wifi.WifiManager; 25 import android.os.BatteryManager; 26 import android.os.Bundle; 27 import android.os.Handler; 28 import android.os.Vibrator; 29 import android.telephony.TelephonyManager; 30 import android.text.format.Formatter; 31 import android.util.Log; 32 import android.widget.Toast; 33 34 public class MainActivity extends UnityPlayerActivity { 35 private Vibrator mVibrator01;//聲明一個振動器物件 36 private static Context instance; 37 private String TAG = "log"; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 instance = getApplicationContext; 43 CreateToast("默認的初始化"); 44 45 onCoderReturn("pid:"+android.os.Process.myPid +" "+getBaseContext.getPackageName);//顯示進程id和包名 46 } 47 48 public static Context getContext 49 { 50 return instance; 51 } 52 53 /* 54 * 求和 55 */ 56 public int Sum(int a,int b) 57 { 58 int sum = a+b; 59 onCoderReturn(String.format("%s + %s = %s", a,b,sum)); 60 return sum; 61 } 62 63 /* 64 * 震動 65 */ 66 public void ClickShake 67 { 68 mVibrator01 = (Vibrator)getApplication.getSystemService(Service.VIBRATOR_SERVICE); 69 mVibrator01.vibrate(new long[]{100,10,100,1000},-1);//自訂整棟模式,只震動一次 70 } 71 72 /* 73 * 狀態返回Unity 74 */ 75 public void onCoderReturn(String state ) 76 { 77 String gameObjectName = "Main Camera"; 78 String methodName = "OnCoderReturn"; 79 String arg0 = state; 80 UnityPlayer.UnitySendMessage(gameObjectName, methodName, arg0); 81 } 82 83 /***********************調用Android Toast***************************/ 84 85 /* 86 * Unity調用安卓的Toast 87 */ 88 public void UnityCallAndroidToast(final String toast ) 89 { 90 runOnUiThread(new Runnable{ 91 @Override 92 public void run { 93 //onCoderReturn("Android:UnityCallAndroidToast"); 94 /* 95 * 第一個參數:當前上下午的環境。可用getApplicationContext或this 96 * 第二個參數:要顯示的字串 97 * 第三個參數:顯示時間的長短。Toast有默認的兩個LENGTH_SHORT(短)和LENGTH_LONG(長),也可以使用毫秒2000ms 98 * */ 99 Toast.makeText(MainActivity.this,toast,Toast.LENGTH_SHORT).show; 100 } 101 }); 102 103 } 104 105 /* 106 * 創建Toast 107 */ 108 public void CreateToast(final String toast) 109 { 110 runOnUiThread(new Runnable{ 111 @Override 112 public void run { 113 //onCoderReturn("CreateToast"); 114 Toast.makeText( 115 MainActivity.this, 116 toast,Toast.LENGTH_LONG).show; 117 } 118 }); 119 } 120 121 122 /*************************************重啟應用*************************************/ 123 124 /* 125 * 重新啟動應用 126 */ 127 public void RestartApplication{ 128 CreateToast("應用重啟中..."); 129 130 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 131 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 132 startActivity(launch); 133 } 134 135 /* 136 * UI 執行緒重啟應用 137 */ 138 public void RestartApplicationOnUIThread{ 139 CreateToast("3s後應用重啟..."); 140 new Thread{ 141 public void run{ 142 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 143 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 144 startActivity(launch); 145 android.os.Process.killProcess(android.os.Process.myPid); 146 onCoderReturn("pid:"+android.os.Process.myPid); 147 } 148 }.start; 149 finish; 150 } 151 152 /* 153 * 立即重啟應用 ok 154 */ 155 public void RestartApplication1{ 156 new Thread{ 157 public void run{ 158 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 159 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 160 startActivity(launch); 161 android.os.Process.killProcess(android.os.Process.myPid); 162 } 163 }.start; 164 finish; 165 } 166 167 /* 168 * 延遲5s重啟應用 ok 169 */ 170 public void RestartApplication2{ 171 ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); 172 progressDialog.setMessage("5s後自動重啟…"); 173 progressDialog.show; 174 175 new Handler.postDelayed(new Runnable{ 176 public void run { 177 Intent launch=getBaseContext.getPackageManager.getLaunchIntentForPackage(getBaseContext.getPackageName); 178 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 179 startActivity(launch); 180 android.os.Process.killProcess(android.os.Process.myPid); 181 } 182 }, 5000); 183 } 184 185 /************************調用協力廠商app *****************************/ 186 187 public void CallThirdApp(String packageName)//packageName 188 { 189 Intent intent = getPackageManager.getLaunchIntentForPackage(packageName); 190 startActivity(intent); 191 onCoderReturn(packageName); 192 } 193 194 /* 195 * 獲取所有安裝包名和apk名字 196 */ 197 public void GetAllPackageName 198 { 199 PackageManager packageManager = null; 200 packageManager = getPackageManager; 201 List mAllPackages=new ArrayList; 202 mAllPackages = packageManager.getInstalledPackages(0); 203 for(int i = 0; i < mallpackages.size;="" i="" ++)="" 204="" {="" 205="" packageinfo="" packageinfo="mAllPackages.get(i);" 206="" log.i("package="" path",="" packageinfo.applicationinfo.sourcedir);="" 207="" log.i("apk="" name",="" (string)="" packageinfo.applicationinfo.loadlabel(packagemanager)="" );="" 208="" oncoderreturn("sourcedir:"+packageinfo.applicationinfo.sourcedir+"="" apkname:"+packageinfo.applicationinfo.loadlabel(packagemanager));="" 209="" }="" 210="" 211="" }="" 212="" 213="" 214="" *="" 個人安卓的額協力廠商app="" ok="" 215="" */="" 216="" public="" void="" getinstalledpackagename="" 217="" {="" 218="" packagemanager="" packagemanager="null;" 219="" packagemanager="getPackageManager;" 220="" list="" mallpackages="new" arraylist;="" 221="" mallpackages="packageManager.getInstalledPackages(0);" 222="" for(int="" i="0;" i="" widgetproviderinfos="AppWidgetManager.getInstance(this).getInstalledProviders;" 242="" log.d("widget",="" "allwidgetsize=" + widgetProviderInfos.size); 243 for (int i = 0; i 0 && scale > 0) 294 { 295 level = (rawlevel * 100) / scale; 296 CreateToast(" 剩餘電量:"+level+"%");="" 297="" log.v(tag,"現在的電量是:"+level+"%"="" );="" 298="" targetstr="level+"|"+scale+"|"+status;" 299="" oncoderreturn("當前電量:"+level+"|總容量:"+scale+"|充電狀態:"+status+"|電壓:"+batteryv+"電池健康狀態:"+health+"溫度:"+t+"="" 現在的電量是:"+level+"%");="" 300="" unityplayer.unitysendmessage("main="" canera",="" "onbatterydatareturn",="" targetstr);="" 301="" }="" 302="" else="" 303="" {="" 304="" oncoderreturn("獲取不到電池資訊!");="" 305="" }="" 306="" 307="" if(health="=" batterymanager.battery_health_good="" )="" 308="" {="" 309="" log.v(tag,="" "電池狀態很好");="" 310="" }="" 311="" if(status="=BatteryManager.BATTERY_STATUS_CHARGING)//充電標記2" 312="" {="" 313="" unitycallandroidtoast("電池充電中...");="" 314="" }="" 315="" else="" 316="" {="" 317="" unitycallandroidtoast("電池放電中...");="" 318="" }="" 319="" notifybattery(level,scale,status);="" 320="" 321="" return="" targetstr="" ;="" 322="" }="" 323="" 324="" 獲取詳細電量資訊="" 返回電量|是否充電中="" 325="" public="" string="" notifybattery(int="" level,int="" scale,int="" status)="" 326="" {="" 327="" string="" batterystatue="" ;="" 328="" int="" per="scale/5;" 329="" if(levelper="" &&="" level2*per="" &&="" level3*per="" &&="" level=""> 8) + "." + (0xFF & paramInt >> 16) + "." 419 + (0xFF & paramInt >> 24); 420 } 421 /************************檢測運營商*******************************/ 422 /* 423 * 檢測SIM卡類型 424 */ 425 public String CheckSIM{ 426 String SIMTypeString = ""; 427 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 428 String operator = telManager.getSimOperator; 429 if (operator != null){ 430 if (operator.equals("46000") || operator.equals("46002")){ 431 CreateToast("此卡屬於(中國移動)"); 432 SIMTypeString = "中國移動"; 433 } else if (operator.equals("46001")){ 434 CreateToast("此卡屬於(中國聯通)"); 435 SIMTypeString = "中國聯通"; 436 437 } else if (operator.equals("46003")){ 438 CreateToast("此卡屬於(中國電信)"); 439 SIMTypeString = "中國電信"; 440 } 441 } 442 return SIMTypeString; 443 } 444 }

基本上每個功能都有注釋,我相信你能看懂得,因為我也是個小菜鳥!接下來匯出jar檔,在Unity中測試。

匯出時重要的一步,選這幾個就可以了!

8,見一個Unity工程,首先建一個Plugins/Android的資料夾,顧名思義,這個資料夾就是存放安卓外掛程式的。將Libs,Res,AndroidMainFest.xml拷貝到該目錄下。如下:

using UnityEngine; using System.Collections; using UnityEngine.UI; public class Test : MonoBehaviour {

過程中會遇到幾個問題,獲取電量和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.gitUnity工程:git@git.oschina.net:wuzhang/UnityCallAndroidAPI.git如果你覺得有什麼問題,大家共同交流,一起學習,以後有時間把協力廠商SDK的對接及合併寫一些。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示