package com.lsq.test;
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.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.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class Test 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);
}
public void onCoderReturn(int state)
{
UnityCallAndroidToast("获取网络信息:"+state);
String gameObjectName = "Main Camera";
String methodName = "OnCoderReturn";
String arg0 = Integer.toString(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(Test.this,toast,Toast.LENGTH_SHORT).show();
}
});
}
/*
* 创建Toast
*/
public void CreateToast(final String toast)
{
runOnUiThread(new Runnable(){
@Override
public void run() {
//onCoderReturn("CreateToast()");
Toast.makeText(
Test.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(Test.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 mAllPackages=new ArrayList();
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 mAllPackages=new ArrayList();
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 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();
//设置跳转到的页面 ,时间等内容
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 Camera", "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)//5
{
Log.v(TAG, "满电量");
CreateToast("电池电量充足");
}
else if(status == BatteryManager.BATTERY_STATUS_NOT_CHARGING)//4
{
Log.v(TAG,"未充电");
}
else if(status == BatteryManager.BATTERY_STATUS_DISCHARGING)//3
{
Log.v(TAG,"放电中");
CreateToast("电池放电中");
}
if(status == BatteryManager.BATTERY_STATUS_UNKNOWN)//1
{
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")
public String ObtainWifiInfo() {
UnityCallAndroidToast("获取Wifi信息中...");
// Wifi的连接速度及信号强度:
String result="";
WifiManager wifiManager = (WifiManager) getSystemService(Context.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;
CreateToast(result);
Log.v(TAG,result);
UnityPlayer.UnitySendMessage("Main Camera", "OnWifiDataReturn", result);
}
if (result == "" || result == " ") {
CreateToast("调用getCurrentNetDBM");
getCurrentNetDBM();
CreateToast("调用getCurrentNetDBM结束");
}
return result;
}
//转换IP地址
private String intToIp(int paramInt) {
return (paramInt & 0xFF) + "." + (0xFF & paramInt >> 8) + "." + (0xFF & paramInt >> 16) + "."
+ (0xFF & paramInt >> 24);
}
/************************检测运营商*******************************/
/*
* 检测SIM卡类型
*/
/**
* 得到当前的手机蜂窝网络信号强度
* 获取LTE网络和3G/2G网络的信号强度的方式有一点不同,
* LTE网络强度是通过解析字符串获取的,
* 3G/2G网络信号强度是通过API接口函数完成的。
* asu 与 dbm 之间的换算关系是 dbm=-113 + 2*asu
*/
public void getCurrentNetDBM() {
CreateToast("获取网络信息中...");
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener mylistener = new PhoneStateListener(){
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
String signalInfo = signalStrength.toString();
String[] params = signalInfo.split(" ");
if(tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE){
//4G网络 最佳范围 >-90dBm 越大越好
int Itedbm = Integer.parseInt(params[9]);
onCoderReturn(Itedbm);
}else if(tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSDPA ||
tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSPA ||
tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_HSUPA ||
tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS){
//3G网络最佳范围 >-90dBm 越大越好 ps:中国移动3G获取不到 返回的无效dbm值是正数(85dbm)
//在这个范围的已经确定是3G,但不同运营商的3G有不同的获取方法,故在此需做判断 判断运营商与网络类型的工具类在最下方
String operator = tm.getSimOperator();
if (operator != null){
if (operator.equals("46000") || operator.equals("46002"))
{
CreateToast("此卡属于(中国移动)");
onCoderReturn(0);
} else if (operator.equals("46001")){
CreateToast("此卡属于(中国联通)");
onCoderReturn(signalStrength.getCdmaDbm());
} else if (operator.equals("46003")){
CreateToast("此卡属于(中国电信)");
onCoderReturn(signalStrength.getEvdoDbm());
}
}
}else{
//2G网络最佳范围>-90dBm 越大越好
int asu = signalStrength.getGsmSignalStrength();
int dbm = -113 + 2*asu;
onCoderReturn(dbm);
}
}
};
CreateToast("网络开始监听 中...");
//开始监听
tm.listen(mylistener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
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;
}
}
在unity中classes文件是存在的,这里将导出文件中的classes删除