一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发。首先必须要考虑的就是集成第三方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,准备工作结束,可以贴代码了!

 package com.wuzhang.testandroid;

 import java.util.ArrayList;
 import java.util.List;

 import com.unity3d.player.UnityPlayer;
 import com.unity3d.player.UnityPlayerActivity;

 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.ProgressDialog;
 import android.app.Service;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.BatteryManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Vibrator;
 import android.telephony.TelephonyManager;
 import android.text.format.Formatter;
 import android.util.Log;
 import android.widget.Toast;

 public class MainActivity extends UnityPlayerActivity {
     private Vibrator mVibrator01;//声明一个振动器对象
     private static Context instance;
     private String TAG = "log";

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         instance = getApplicationContext();
         CreateToast("默认的初始化");

         onCoderReturn("pid:"+android.os.Process.myPid() +" "+getBaseContext().getPackageName());//显示进程id和包名
     }

     public static Context getContext()
     {
         return instance;
     }

     /*
      * 求和
      */
     public int Sum(int a,int b)
     {
         int sum = a+b;
         onCoderReturn(String.format("%s + %s = %s", a,b,sum));
         return sum;
     }

     /*
      * 震动
      */
     public void ClickShake()
     {
         mVibrator01 = (Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);
         mVibrator01.vibrate(new long[]{100,10,100,1000},-1);//自定义整栋模式,只震动一次
     }  

     /*
      * 状态返回Unity
      */
     public void onCoderReturn(String state )
     {
         String gameObjectName = "Main Camera";
         String methodName = "OnCoderReturn";
         String arg0 = state;
         UnityPlayer.UnitySendMessage(gameObjectName, methodName, arg0);
     }

     /***********************调用Android Toast***************************/

     /*
      * Unity调用安卓的Toast
      */
       public void UnityCallAndroidToast(final String toast )
       {
           runOnUiThread(new Runnable(){
               @Override
               public void run() {
                   //onCoderReturn("Android:UnityCallAndroidToast()");
                   /*
                    * 第一个参数:当前上下午的环境。可用getApplicationContext()或this
                    * 第二个参数:要显示的字符串
                    * 第三个参数:显示时间的长短。Toast有默认的两个LENGTH_SHORT(短)和LENGTH_LONG(长),也可以使用毫秒2000ms
                    * */
                   Toast.makeText(MainActivity.this,toast,Toast.LENGTH_SHORT).show();
               }
           });

       }

       /*
        * 创建Toast
        */
       public void CreateToast(final String toast)
       {
           runOnUiThread(new Runnable(){
               @Override
               public void run() {
                   //onCoderReturn("CreateToast()");
                   Toast.makeText(
                           MainActivity.this,
                           toast,Toast.LENGTH_LONG).show();
               }
           });
       }

       /*************************************重启应用*************************************/

       /*
      * 重新启动应用
      */
     public void RestartApplication(){
         CreateToast("应用重启中...");

         Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
         launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         startActivity(launch);
     } 

     /*
      * UI 线程重启应用
      */
     public void RestartApplicationOnUIThread(){
         CreateToast("3s后应用重启...");
         new Thread(){
             public void run(){
                     Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
                     launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                     startActivity(launch);
                     android.os.Process.killProcess(android.os.Process.myPid());
                     onCoderReturn("pid:"+android.os.Process.myPid());
                   }
             }.start();
             finish();
     }

     /*
      * 立即重启应用 ok
      */
     public void RestartApplication1(){
         new Thread(){
             public void run(){
                     Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
                     launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                     startActivity(launch);
                     android.os.Process.killProcess(android.os.Process.myPid());
                 }
             }.start();
             finish();
     }

     /*
      * 延迟5s重启应用 ok
      */
     public void RestartApplication2(){
         ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
         progressDialog.setMessage("5s后自动重启…");
         progressDialog.show(); 

         new Handler().postDelayed(new Runnable(){
             public void run() {
                 Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
                 launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                 startActivity(launch);
                 android.os.Process.killProcess(android.os.Process.myPid());
             }
          }, 5000);
     }

     /************************调用第三方app *****************************/

     public void CallThirdApp(String packageName)//packageName
     {
         Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
         startActivity(intent);
         onCoderReturn(packageName);
     }

     /*
      * 获取所有安装包名和apk名字
      */
     public void GetAllPackageName()
     {
         PackageManager packageManager = null;
         packageManager = getPackageManager();
         List<PackageInfo> mAllPackages=new ArrayList<PackageInfo>();
         mAllPackages = packageManager.getInstalledPackages(0);
         for(int i = 0; i < mAllPackages.size(); i ++)
         {
             PackageInfo packageInfo = mAllPackages.get(i);
             Log.i("package path", packageInfo.applicationInfo.sourceDir);
             Log.i("apk name", (String) packageInfo.applicationInfo.loadLabel(packageManager) );
             onCoderReturn("sourceDir:"+packageInfo.applicationInfo.sourceDir+" apkName:"+packageInfo.applicationInfo.loadLabel(packageManager));
         } 

     }

     /*
      * 个人安卓的额第三方App ok
      */
     public void GetInstalledPackageName()
     {
         PackageManager packageManager = null;
         packageManager = getPackageManager();
         List<PackageInfo> mAllPackages=new ArrayList<PackageInfo>();
         mAllPackages = packageManager.getInstalledPackages(0);
         for(int i = 0; i < mAllPackages.size(); i ++)
         {
             PackageInfo packageInfo = mAllPackages.get(i);
             if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)<= 0)
             {
                 onCoderReturn("apkName:"+packageInfo.applicationInfo.loadLabel(packageManager)+"package path:"+packageInfo.applicationInfo.packageName);
             }
             else
             {
                 onCoderReturn("sys apkName:"+packageInfo.applicationInfo.loadLabel(packageManager));
             }
         }
     }

     /*
      * 获取安装包
      */
     public void GetAllWidget()
     {
         List<AppWidgetProviderInfo> widgetProviderInfos = AppWidgetManager.getInstance(this).getInstalledProviders();
         Log.d("widget", "allWidgetSize = " + widgetProviderInfos.size());
         for (int i = 0; i < widgetProviderInfos.size(); i++) {
             AppWidgetProviderInfo info = widgetProviderInfos.get(i);
             String packageName = info.provider.getPackageName();    //获取包名
             String className = info.provider.getClassName();        //获取类名
             Log.d("widget", "packageName: " + packageName);
             Log.d("widget", "className: " + className);
             onCoderReturn("packageName:"+packageName);
         }
     }

     /**************************安卓本地推送通知***********************************/
     /*
      * 安卓本地推送
      */
     @SuppressWarnings("deprecation")
     public void SendNotification(String title,String content)
     {
         NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         //1.实例化一个通知,指定图标、概要、时间
         Notification n=new Notification(R.drawable.ic_launcher,content,3000);
         //2.指定通知的标题、内容和intent
         Intent intent = new Intent(this, MainActivity.class);
         //设置跳转到的页面 ,时间等内容
         PendingIntent pi= PendingIntent.getActivity(this, 0, intent, 1000);
         n.setLatestEventInfo(this, title, content, pi);
         n.flags |= Notification.FLAG_AUTO_CANCEL; // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。
         //3.指定声音
         n.defaults = Notification.DEFAULT_SOUND;
         n.when = System.currentTimeMillis(); // 立即发生此通知
         //4.发送通知
         nm.notify(1, n);
     }

     /**************************************************************/
     /**
      * 1.获取手机电池电量 2.检查手机是否充电
      * */
     public String MonitorBatteryState() {
         UnityCallAndroidToast("获取电池信息中...");
         IntentFilter ifilter=new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
         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; //电池摄氏温度,默认获取的非摄氏温度值,需做一下运算转换
         String targetStr="";
         int level = -1;
         if (rawlevel > 0 && scale > 0)
         {
             level = (rawlevel * 100) / scale;
             CreateToast("剩余电量:"+level+"%");
             Log.v(TAG,"现在的电量是:"+level+"%" );
             targetStr = level+"|"+scale+"|"+status;
             onCoderReturn("当前电量:"+level+"|总容量:"+scale+"|充电状态:"+status+"|电压:"+batteryV+"电池健康状态:"+health+"温度:"+T+" 现在的电量是:"+level+"%");
             UnityPlayer.UnitySendMessage("Main Canera", "OnBatteryDataReturn", targetStr);
         }
         else
         {
             onCoderReturn("获取不到电池信息!");
         }

         if(health == BatteryManager.BATTERY_HEALTH_GOOD )
         {
              Log.v(TAG, "电池状态很好");
         }
         if(status==BatteryManager.BATTERY_STATUS_CHARGING)//充电标记2
         {
             UnityCallAndroidToast("电池充电中...");
         }
         else
         {
              UnityCallAndroidToast("电池放电中...");
         }
         //notifyBattery(level,scale,status);

         return targetStr ;
     }

     //获取详细电量信息 返回电量|是否充电中
     public String notifyBattery(int level,int scale,int status)
     {
         String batteryStatue = "";
         int per = scale/5;
         if(level<=per)
         {
            Log.v(TAG, "手机电量低于1/5");
            batteryStatue+= "0.2|";
         }
         else if(level>per && level<=per*2)
         {
             Log.v(TAG, "手机电量低于2/5");
             batteryStatue+= "0.4|";
         }
         else if(level>2*per && level<=per*3)
         {
             Log.v(TAG, "手机电量低于3/5");
             batteryStatue+= "0.6|";
         }
         else if(level>3*per && level<=per*4)
         {
             Log.v(TAG, "手机电量低于4/5");
             batteryStatue+= "0.8|";
         }
         else
         {
             Log.v(TAG, "手机电量充足");
             batteryStatue+= "1|";
         }
         if(status==BatteryManager.BATTERY_STATUS_CHARGING)//充电标记2
         {
             Log.v(TAG,"充电中,电量背景为animation");
             batteryStatue+="2";
             UnityCallAndroidToast("电池充电中...");
         }
         else
         {  

             {
                 Log.v(TAG, "满电量");
                 CreateToast("电池电量充足");
             }

             {
                 Log.v(TAG,"未充电");
             }

             {
                 Log.v(TAG,"放电中");
                 CreateToast("电池放电中");
             }

             {
                 Log.v(TAG,"状态未知");
             }
             batteryStatue+="0";
         }
         CreateToast(batteryStatue);
         //电量信息格式:剩余百分比|是否充电中
         return batteryStatue;
     } 

     //获取wifi信号强度
     //wifiinfo.getRssi();获取RSSI,RSSI就是接受信号强度指示。
     //这里得到信号强度就靠wifiinfo.getRssi()这个方法。
     //得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好,
     //-50到-70表示信号偏差,小于-70表示最差,
     //有可能连接不上或者掉线,一般Wifi已断则值为-200。
     @SuppressWarnings("deprecation")
     private String ObtainWifiInfo() {
         // Wifi的连接速度及信号强度:
         String result="";
         WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
         WifiInfo info = wifiManager.getConnectionInfo();
         if (info.getBSSID() != null) {
             // 链接信号强度
             int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
             // 链接速度
             int speed = info.getLinkSpeed();
             // 链接速度单位
             String units = WifiInfo.LINK_SPEED_UNITS;
             // Wifi源名称
             String ssid = info.getSSID();
             int ip = info.getIpAddress();
             String mac = info.getMacAddress();
             result = strength+"|"+intToIp(ip)+"|"+mac+"|"+ssid;
         }
         UnityPlayer.UnitySendMessage("Main Canera", "OnWifiDataReturn", result);
         UnityCallAndroidToast(result);
         return result;
    }
     //转换IP地址
     private String intToIp(int paramInt) {
         return (paramInt & 0xFF) + "." + (0xFF & paramInt >> 8) + "." + (0xFF & paramInt >> 16) + "."
                 + (0xFF & paramInt >> 24);
     }
     /************************检测运营商*******************************/
     /*
      * 检测SIM卡类型
      */
      public String CheckSIM(){
          String SIMTypeString = "";
             TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
             String operator = telManager.getSimOperator();
             if (operator != null){
                 if (operator.equals("46000") || operator.equals("46002")){
                     CreateToast("此卡属于(中国移动)");
                     SIMTypeString = "中国移动";
                 } else if (operator.equals("46001")){
                     CreateToast("此卡属于(中国联通)");
                     SIMTypeString = "中国联通";

                 } else if (operator.equals("46003")){
                     CreateToast("此卡属于(中国电信)");
                     SIMTypeString = "中国电信";
                 }
             }
             return SIMTypeString;
         }
 }

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

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

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

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

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Test : MonoBehaviour
{  public Text log;  string batteryData;
  string wifiData;
    private void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 140, 40), "发送通知"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("UnityCallAndroidToast", "这是Unity调用Android的Toast!");
        }

        if (GUI.Button(new Rect(10, 70, 140, 40), "求和"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            int sum = jo.Call<int>("Sum",new object[] { 10, 20 });
            log.text = "";
            jo.Call("ClickShake");//调用安卓震动
        }

        if (GUI.Button(new Rect(10, 130, 140, 40), "Toast"))//创建安卓 Toast
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("CreateToast","初始化中...");
        }

        if (GUI.Button(new Rect(10, 190, 140, 40), "立即重启应用"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("RestartApplication");
        }

        if (GUI.Button(new Rect(10, 250, 140, 40), "UI线程重启应用"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("RestartApplicationOnUIThread");
        }

        if (GUI.Button(new Rect(10, 310, 140, 40), "重启应用"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("RestartApplication1");
        }

        if (GUI.Button(new Rect(10, 370, 140, 40), "5s重启应用"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("RestartApplication2");
        }

        if (GUI.Button(new Rect(10, 430, 140, 40), "获取安装apk"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("GetAllPackageName");
        }

        if (GUI.Button(new Rect(10, 490, 140, 40), "调用APP"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("CallThirdApp","com.tencent.mm");
        }

        if (GUI.Button(new Rect(10, 550, 140, 40), "Unity本地推送"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("SendNotification",new string[] {"奇迹:最强者", "勇士们 魔龙讨伐即将开始" });
        }

        if (GUI.Button(new Rect(10, 610, 140, 40), "获取所有App"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("GetAllWidget");
        }

        if (GUI.Button(new Rect(10, 670, 140, 40), "获取已安装的App"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("GetInstalledPackageName");
        }

		if (GUI.Button(new Rect(10, 730, 140, 40), "获取电池信息"))
		{
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
			batteryData = jo.Call<string>("MonitorBatteryState");
			OnBatteryDataBack(batteryData);
		}

		if (GUI.Button(new Rect(10, 790, 140, 40), "获取wifi强度"))
		{
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
			wifiData = jo.Call<string>("ObtainWifiInfo");
			OnWifiDataBack(wifiData);
		}
		if (GUI.Button(new Rect(10, 850, 140, 40), "获取运营商名称"))
		{
			AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
			string simType = jo.Call<string>("CheckSIM");
			log.text = simType;
		}

        if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home))
        {
            Application.Quit();
        }

    }

	void GetBatteryAnWifiData()
	{
		batteryData = "";
		wifiData = "";
		AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
		batteryData = jo.Call<string>("MonitorBatteryState");
		log.text = batteryData;
		AndroidJavaClass jc1 = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		AndroidJavaObject jo1 = jc.GetStatic<AndroidJavaObject>("currentActivity");
		wifiData = jo1.Call<string>("ObtainWifiInfo");
		log.text += wifiData;
		OnBatteryDataBack(batteryData);
		OnWifiDataBack(wifiData);
	}
	void OnBatteryDataBack(string batteryData)//level+"|"+scale+"|"+status;
	{
		string[] args = batteryData.Split('|');
		if (args[2] == "2")
		{
			log.text += "电池充电中";
		}
		else
		{
			log.text += "电池放电中";
		}
		float percent = int.Parse(args[0])/float.Parse(args[1]);
		log.text += (Mathf.CeilToInt(percent)+"%").ToString();
	}
	void OnWifiDataBack(string wifiData)//strength+"|"+intToIp(ip)+"|"+mac+"|"+ssid;
	{
		//分析wifi信号强度
		//获取RSSI,RSSI就是接受信号强度指示。
		//得到的值是一个0到-100的区间值,是一个int型数据,其中0到-50表示信号最好,
		//-50到-70表示信号偏差,小于-70表示最差,
		//有可能连接不上或者掉线,一般Wifi已断则值为-200。
		log.text += wifiData;
		string[] args = wifiData.Split('|');
		if (int.Parse(args[0]) > -50 && int.Parse(args[0]) < 0)
		{
			log.text += "Wifi信号强度很棒";
		}
		else if (int.Parse(args[0]) > -70 && int.Parse(args[0]) < -50)
		{
			log.text += "Wifi信号强度一般";
		}
		else if (int.Parse(args[0]) > -150 && int.Parse(args[0]) < -70)
		{
			log.text += "Wifi信号强度很弱";
		}
		else if (int.Parse(args[0]) < -200)
		{
			log.text += "Wifi信号JJ了";
		}
		string ip = "IP:" + args[1];
		string mac = "MAC:" + args[2];
		string ssid = "Wifi Name:" + args[3];
		log.text += ip;
		log.text += mac;
		log.text += ssid;
	}

    /// <summary>
    /// 安卓日志
    /// </summary>
    /// <param name="str"></param>
    void OnCoderReturn(string str)
    {
        log.text += str;
    }

	void OnBatteryDataReturn(string batteryData)
	{
		string[] args = batteryData.Split('|');
		if (args[2] == "2")
		{
			log.text += "电池充电中";
		}
		else
		{
			log.text += "电池放电中";
		}
		log.text += (args[0] + "%").ToString();
	}

	void OnWifiDataReturn(string wifiData)
	{
		log.text += wifiData;
		string[] args = wifiData.Split('|');
		if (int.Parse(args[0]) > -50 && int.Parse(args[0]) <100)
		{
			log.text += "Wifi信号强度很棒";
		}
		else if (int.Parse(args[0]) > -70 && int.Parse(args[0]) < -50)
		{
			log.text += "Wifi信号强度一般";
		}
		else if (int.Parse(args[0]) > -150 && int.Parse(args[0]) < -70)
		{
			log.text += "Wifi信号强度很弱";
		}
		else if (int.Parse(args[0]) < -200)
		{
			log.text += "Wifi信号JJ了";
		}
		string ip = "IP:" + args[1];
		string mac = "MAC:" + args[2];
		string ssid = "Wifi Name:" + args[3];
		log.text += ip;
		log.text += mac;
		log.text += ssid;
	}
}

过程中会遇到几个问题,获取电量和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获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用的更多相关文章

  1. 获取及管理Android 手机运营商及状态

    主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...

  2. 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下: PackageManager packageManager = this.getPackageMana ...

  3. 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...

  4. 命令行从Android手机中导出已安装APK的方法调研

    一.背景 二.步骤 一.背景 很多时候,APK文件只存在于应用市场,在PC上无法直接下载.用手机下载下来后就直接安装了,也不能保存原始的APK文件. APK安装到手机后,Android系统会保存一份和 ...

  5. Android实例-获取安卓手机WIFI信息(XE8+小米2)

    结果: 1.必须打开Access wifi state权限,不打开权限会出图二的错误. 相关资料: http://blog.csdn.net/lyf_lyf/article/category/1735 ...

  6. 【工具类】获取手机sim卡的运营商

    加入权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> package ...

  7. Android手机上判断网络运营商

    我们想获取手机的运营商信息.通常都会去调用系统的TelephonyManager类的取数据.但是很多时候可能取不到卡的信息(例如双卡手机和 一些特殊卡),这样就区别不了运营商了.但是有时候我们的需求要 ...

  8. PowerShell脚本自动设置安卓手机wifi代理

    在实际测试工作中,经常要将安卓手机通过wifi代理的形式连接到本机的fiddler或charles服务器代理进行抓包测试.最近一直在想,有没有什么方法可以自动设置安卓手机的wifi代理,曾经想通过修改 ...

  9. iOS获取运营商的相关信息

    1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...

随机推荐

  1. jQuery-1.9.1源码分析系列(四) 缓存系统

    先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...

  2. js获取上一个月、下一个月格式为yyyy-mm-dd的日期

    /** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...

  3. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  4. 杭JS

    杭JS的视频终于出来了.看了Garry Yao的视频依旧看不懂...总体上感觉是在职场上,我不在孤单了,勇敢的前进吧! 玉伯: 视频看了很多,什么情绪管理实践管理,最值得学习的就是知识管理定律了,找到 ...

  5. C++静态成员总结(转)

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  6. GUI按键绑定到键盘和打印组件

    首先说明一点 按键绑定到键盘和设置快捷键是不一样的 按键绑定键盘是按键有了和button一样的功能,没有焦点时也能使用(WHEN_IN_FOCUSED_WINDOW),甚至有时候单独作为一个事件(有自 ...

  7. 【centos6 , 6】linux 查看帮助文档:

    1. 使用   命令 -h 或 命令 --help ,  例: ls -h 2. man命令  : man  命令              例:man ls 3.info命令:           ...

  8. appiun滑动的简单封装

    import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.test ...

  9. oracle 登录数据库时报 无监听 的一种解决方式(监听日志文件达到4g默认上限)

    问题:登录服务器时 报无监听服务 检查步骤: 1.进入sqlplus查看数据库的状态,显示当前数据库的状态为OPEN 脚本:select status from v$Instance; 2.检查数据库 ...

  10. ARCGIS10.5安装教程(附完整安装包和汉化包)

    2017年7月,Esri公司发布了arcgis10.5.1版本,该版本的整体界面风格延续了10.0版本的界面风格,新功能介绍详见 http://www.3snews.net/column/252000 ...