一個完整的遊戲專案上線需要不斷的完善優化, 但是到了後期的開發不再僅僅是遊戲了, 它的複雜度遠遠大於純粹的應用開發。 首先必須要考慮的就是集成協力廠商SDK, 支付這塊管道商已經幫你我們做好了, 只需要按照文檔對接就好。 其次是各種各樣的功能需求, 例如社交中的語音聊天, 我們遊戲使用的雲娃的SDK,支援語音翻譯文字, 推送使用的是極光。 對接SDK這塊說簡單吧有時也不簡單, 需要有一定的java基礎和安卓開發基礎。 說實話我是沒有一點安卓開發基礎的, 大二假期裡看了幾天java基礎從入門到放棄,
今天週末, 在家沒事, 看到了之前玩的小東西, 雖然上傳到了git, 但是還是想寫下來。 今天這些不是協力廠商SDK的對接, 而是安卓原生本地的一些API的調用。 例如:獲取手機的硬體資訊, 在內測時是非常有必要的, 在統計遊戲的相容性和機型適配上有很大幫助的, 例如這麼一個需求, 玩家離線掛機獲得了很多道具和經驗,
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的對接及合併寫一些。