一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发。首先必须要考虑的就是集成第三方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
{
if(status == BatteryManager.BATTERY_STATUS_FULL)//
{
Log.v(TAG, "满电量");
CreateToast("电池电量充足");
}
else if(status == BatteryManager.BATTERY_STATUS_NOT_CHARGING)//
{
Log.v(TAG,"未充电");
}
else if(status == BatteryManager.BATTERY_STATUS_DISCHARGING)//
{
Log.v(TAG,"放电中");
CreateToast("电池放电中");
}
if(status == BatteryManager.BATTERY_STATUS_UNKNOWN)//
{
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,调用第三方应用,强制自动重启本应用的更多相关文章
-
获取及管理Android 手机运营商及状态
主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...
-
MTK Android 读取SIM卡参数,获取sim卡运营商信息
android 获取sim卡运营商信息(转) TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TE ...
-
error while obtaining ui hierarchy xml file...用 uiautomatorviewer 获取安卓手机软件页面时报错
Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't ...
-
安卓手机可以连上wifi但无法上网的解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 前晚我的安卓手机还可以连接wifi上网,昨晚显示已经连接,但是死活打不开网页.于是到网上查了下,发现要将原来的DHCP ...
-
Python爬网——获取安卓手机统计数据
[本文出自天外归云的博客园] 1. 在安卓网上对热门机型进行爬网,取前五十: # -*- coding: utf-8 -*- import requests,re from bs4 import Be ...
-
赵雅智_android获取本机运营商,手机号部分能获取
手机号码不是全部的都能获取.仅仅是有一部分能够拿到. 这个是因为移动运营商没有把手机号码的数据写入到sim卡中.SIM卡仅仅有唯一的编号.供网络与设备 识别那就是IMSI号码,手机的信号也能够说是通过 ...
-
使用 CoreTelephony 框架获取当前网络运营商
CoreTelephony 获取运营商信息,需通过 CoreTelephony.Framework 中的 CTTelephonyNetworkInfo 和 CTCarrier 对象获取,这些都在iOS ...
-
Javascript 获取客户端的运营商 IP 地址 等
客户端获取运营商 会弹出安全隐患问题,需要修改IE activx 选项, 非常麻烦,用我的代码可以轻松获取. <script src="JS/jquery-1.4.1.js" ...
-
【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...
随机推荐
-
SSM整合(三):Spring4与Mybatis3与SpringMVC整合
源码下载 SSMDemo 上一节整合了Mybatis3与Spring4,接下来整合SpringMVC! 说明:整合SpringMVC必须是在web项目中,所以前期,新建的就是web项目! 本节全部采用 ...
-
LoadRunner监控Linux
rstat协议允许网络上的用户获得同一网络上各机器的性能参数. 需要下载3个包: (1)rsh-0.17-14.i386.rpm (2)rsh-server-0.17-14.i386.r ...
-
underscore.js依赖库函数分析二(查找)
查找: 在underscore.js封装了对dom查找的操作,find()和filter()函数,find()函数的查找操作是返回首个与条件相符的元素值,filter()函数是找到与条件相符的所有元素 ...
-
MySQL vs. MongoDB: Choosing a Data Management Solution
原文地址:http://www.javacodegeeks.com/2015/07/mysql-vs-mongodb.html 1. Introduction It would be fair to ...
-
zpf 视图
2014年8月19日 18:12:16 smarty使用了2年, 使用PHP本身做模版引擎也有4个多月了, 最终还是在我的这个框架中抛弃了smarty,转用原生的PHP代码做模版引擎,并简单写了一个视 ...
-
Android之Http网络编程(三)
在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博 ...
-
XmlHttpRequest 使用
1. IE7以后对xmlHttpRequest 对象的创建在不同浏览器上是兼容的.下面的方法是考虑兼容性的,实际项目中一般使用Jquery的ajax请求,可以不考虑兼容性问题. function ge ...
-
C3P0连接池参数解释
<!--acquireIncrement:链接用完了自动增量3个. --> <property name="acquireIncrement">3</ ...
-
Binary Search Tree Iterator leetcode
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
-
ST算法(倍增)(用于解决RMQ)
ST算法 在RMQ(区间最值问题)问题中,我了解到一个叫ST的算法,实质是二进制的倍增. ST算法能在O(nlogn)的时间预处理后,用O(1)的时间在线回答区间最值. f[i][j]表示从i位起的2 ...