package com.eighteengray.commonutillibrary;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Parcelable;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
/**
* 系统信息相关工具类
*/
public class SystemTool
{
//应用相关
/**
* 获取当前应用程序名称
*/
public static String getAppName(Context context)
{
try
{
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
int labelRes = packageInfo.applicationInfo.labelRes;
return context.getResources().getString(labelRes);
} catch (NameNotFoundException e)
{
e.printStackTrace();
}
return null;
}
/**
* 获取当前应用程序的版本名称
*/
public static String getAppVersion(Context context)
{
String version = "0";
try
{
version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
} catch (NameNotFoundException e)
{
throw new RuntimeException(SystemTool.class.getName() + "the application not found");
}
return version;
}
/**
* 获取当前应用程序的版本号
*/
public static int getAppVersionCode(Context context)
{
int version = 0;
try
{
version = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
} catch (NameNotFoundException e)
{
throw new RuntimeException(SystemTool.class.getName() + "the application not found");
}
return version;
}
/**
* 判断当前应用程序是否在后台运行
*/
public static boolean isBackground(Context context)
{
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses)
{
if (appProcess.processName.equals(context.getPackageName()))
{
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND)
{
// 后台运行
return true;
} else
{
// 前台运行
return false;
}
}
}
return false;
}
/**
* 获取应用程序的签名
* @param context
* @param pkgName
*/
public static String getSign(Context context, String pkgName)
{
try
{
PackageInfo pis = context.getPackageManager().getPackageInfo(pkgName, PackageManager.GET_SIGNATURES);
return hexdigest(pis.signatures[0].toByteArray());
} catch (NameNotFoundException e)
{
throw new RuntimeException(SystemTool.class.getName() + "the "
+ pkgName + "'s application not found");
}
}
/**
* 将签名字符串转换成需要的32位签名
* @param paramArrayOfByte
* @return
*/
private static String hexdigest(byte[] paramArrayOfByte)
{
final char[] hexDigits =
{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
try
{
MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
localMessageDigest.update(paramArrayOfByte);
byte[] arrayOfByte = localMessageDigest.digest();
char[] arrayOfChar = new char[32];
for (int i = 0, j = 0; ; i++, j++)
{
if (i >= 16)
{
return new String(arrayOfChar);
}
int k = arrayOfByte[i];
arrayOfChar[j] = hexDigits[(0xF & k >>> 4)];
arrayOfChar[++j] = hexDigits[(k & 0xF)];
}
} catch (Exception e)
{
}
return "";
}
//手机系统相关
/**
* 获取手机IMEI码
* @param cxt
* @return
*/
public static String getPhoneIMEI(Context cxt)
{
TelephonyManager tm = (TelephonyManager) cxt.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
}
/**
* 获取手机系统SDK版本
* @return
*/
public static int getSDKVersion()
{
return android.os.Build.VERSION.SDK_INT;
}
/**
* 获取手机系统内核版本
* @return
*/
public static String getKernelVersion()
{
String kernelVersion = "";
InputStream inputStream = null;
try
{
inputStream = new FileInputStream("/proc/version");
} catch (FileNotFoundException e)
{
e.printStackTrace();
return kernelVersion;
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream), 8 * 1024);
String info = "";
String line = "";
try
{
while ((line = bufferedReader.readLine()) != null)
{
info += line;
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
bufferedReader.close();
inputStream.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
try
{
if (info != "")
{
final String keyword = "version ";
int index = info.indexOf(keyword);
line = info.substring(index + keyword.length());
index = line.indexOf(" ");
kernelVersion = line.substring(0, index);
}
} catch (IndexOutOfBoundsException e)
{
e.printStackTrace();
}
return kernelVersion;
}
/**
* 判断手机是否处于睡眠状态
* @param context
* @return
*/
public static boolean isSleeping(Context context)
{
KeyguardManager kgMgr = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
boolean isSleeping = kgMgr.inKeyguardRestrictedInputMode();
return isSleeping;
}
/**
* 获取手机的可用内存大小
* @param cxt 应用上下文对象context
* @return 当前内存大小
*/
public static int getDeviceUsableMemory(Context cxt)
{
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
return (int) (mi.availMem / (1024 * 1024));
}
/**
* 清理后台进程与服务
* @param cxt 应用上下文对象context
* @return 被清理的数量
*/
public static int gc(Context cxt)
{
long i = getDeviceUsableMemory(cxt);
int count = 0; // 清理掉的进程数
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
// 获取正在运行的service列表
List<RunningServiceInfo> serviceList = am.getRunningServices(100);
if (serviceList != null)
for (RunningServiceInfo service : serviceList)
{
if (service.pid == android.os.Process.myPid())
continue;
try
{
android.os.Process.killProcess(service.pid);
count++;
} catch (Exception e)
{
e.getStackTrace();
continue;
}
}
// 获取正在运行的进程列表
List<RunningAppProcessInfo> processList = am.getRunningAppProcesses();
if (processList != null)
for (RunningAppProcessInfo process : processList)
{
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
if (process.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE)
{
// pkgList 得到该进程下运行的包名
String[] pkgList = process.pkgList;
for (String pkgName : pkgList)
{
try
{
am.killBackgroundProcesses(pkgName);
count++;
} catch (Exception e)
{ // 防止意外发生
e.getStackTrace();
continue;
}
}
}
}
return count;
}
//系统Intent
/**
* 在桌面创建快捷方式
* @param cxt
* @param icon
* @param title
* @param cls
*/
public void createDeskShortCut(Context cxt, int icon, String title, Class<?> cls)
{
// 创建快捷方式的Intent
Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
// 不允许重复创建
shortcutIntent.putExtra("duplicate", false);
// 需要现实的名称
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
// 快捷图片
Parcelable ico = Intent.ShortcutIconResource.fromContext(cxt.getApplicationContext(), icon);
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, ico);
Intent intent = new Intent(cxt, cls);
// 下面两个属性是为了当应用程序卸载时桌面上的快捷方式会删除
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
// 点击快捷图片,运行的程序主入口
shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
// 发送广播。OK
cxt.sendBroadcast(shortcutIntent);
}
/**
* 安装apk
* @param context
* @param file
*/
public static void installApk(Context context, File file)
{
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("application/vnd.android.package-archive");
intent.setData(Uri.fromFile(file));
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* 回到home,后台运行
*/
public static void goHome(Context context)
{
Intent mHomeIntent = new Intent(Intent.ACTION_MAIN);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
context.startActivity(mHomeIntent);
}
/**
* 调用系统发送短信,跳转发短信界面
*/
public static void sendSMS(Context cxt, String smsBody)
{
Uri smsToUri = Uri.parse("smsto:");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", smsBody);
cxt.startActivity(intent);
}
/**
* 调用系统短信接口,后台发送短信
* @param destinationAddress
* @param text
* @param sentIntent
* @param deliveryIntent
*/
public static void sendSMSBackground(String destinationAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
{
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(destinationAddress, null, text, sentIntent, deliveryIntent);
}
/**
* 调用系统群发短信
* @param context
* @param mobileList
* @param content
*/
public static void sendGroupSMS(Context context, ArrayList<String> mobileList, String content)
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < mobileList.size(); i++)
{
stringBuilder.append(mobileList.get(i));
stringBuilder.append(";");
}
if (stringBuilder.length() > 0)
{
stringBuilder.deleteCharAt(mobileList.size() - 1);
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("address", stringBuilder.toString());
intent.putExtra("sms_body", content);
intent.setType("vnd.android-dir/mms-sms");
context.startActivity(intent);
}
/**
* 调用系统邮件,跳转发送邮件界面
* @param context
* @param emails
*/
public static void sendEmail(Context context, String[] emails)
{
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822"); // 设置邮件格式
intent.putExtra(Intent.EXTRA_EMAIL, emails); // 接收人
intent.putExtra(Intent.EXTRA_CC, emails); // 抄送人
intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题
intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文
context.startActivity(Intent.createChooser(intent, "请选择邮件类应用"));
}
/**
* android获取一个用于打开HTML文件的intent
* @param param
* @return
*/
public static Intent getHtmlFileIntent(String param)
{
Uri uri = Uri.parse(param).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(param).build();
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(uri, "text/html");
return intent;
}
/**
* android获取一个用于打开PDF文件的intent
* @param param
* @return
*/
public static Intent getPdfFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/pdf");
return intent;
}
/**
* android获取一个用于打开文本文件的intent
* @param param
* @param paramBoolean
* @return
*/
public static Intent getTextFileIntent(String param, boolean paramBoolean)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (paramBoolean)
{
Uri uri1 = Uri.parse(param);
intent.setDataAndType(uri1, "text/plain");
} else
{
Uri uri2 = Uri.fromFile(new File(param));
intent.setDataAndType(uri2, "text/plain");
}
return intent;
}
/**
* android获取一个用于打开音频文件的intent
* @param param
* @return
*/
public static Intent getAudioFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "audio/*");
return intent;
}
/**
* android获取一个用于打开视频文件的intent
* @param param
* @return
*/
public static Intent getVideoFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "video/*");
return intent;
}
/**
* android获取一个用于打开CHM文件的intent
* @param param
* @return
*/
public static Intent getChmFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/x-chm");
return intent;
}
/**
* android获取一个用于打开Word文件的intent
* @param param
* @return
*/
public static Intent getWordFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/msword");
return intent;
}
/**
* android获取一个用于打开Excel文件的intent
* @param param
* @return
*/
public static Intent getExcelFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/vnd.ms-excel");
return intent;
}
/**
* android获取一个用于打开PPT文件的intent
* @param param
* @return
*/
public static Intent getPptFileIntent(String param)
{
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(new File(param));
intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
return intent;
}
}