package com.bczm.widgetcollections.utils;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Debug;
import android.os.Environment;
import android.os.StatFs;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
/**
* 获取手机 内存 版本 imei 等 信息
*
*/
public class SystemUtils {
/** 获取android系统版本号 */
public static String getOSVersion() {
String release = android.os.Build.VERSION.RELEASE; // android系统版本号
release = "android" + release;
return release;
}
/** 获得android系统sdk版本号 */
public static String getOSVersionSDK() {
return android.os.Build.VERSION.SDK;
}
/** 获得android系统sdk版本号 */
public static int getOSVersionSDKINT() {
return android.os.Build.VERSION.SDK_INT;
}
/** 获取手机型号 */
public static String getDeviceModel() {
return android.os.Build.MODEL;
}
/** 获取设备的IMEI */
public static String getIMEI() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
String imei = null;
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
imei = tm.getDeviceId();
} catch (Exception e) {
LogUtils.e(e);
}
return imei;
}
/** 检测手机是否已插入SIM卡 */
public static boolean isCheckSimCardAvailable() {
Context context = UIUtils.getContext();
if (null == context) {
return false;
}
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSimState() == TelephonyManager.SIM_STATE_READY;
}
/** sim卡是否可读 */
public static boolean isCanUseSim() {
Context context = UIUtils.getContext();
if (null == context) {
return false;
}
try {
TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return TelephonyManager.SIM_STATE_READY == mgr.getSimState();
} catch (Exception e) {
LogUtils.e(e);
}
return false;
}
/** 取得当前sim手机卡的imsi */
public static String getIMSI() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
String imsi = null;
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
imsi = tm.getSubscriberId();
} catch (Exception e) {
LogUtils.e(e);
}
return imsi;
}
/** 返回本地手机号码,这个号码不一定能获取到 */
public static String getNativePhoneNumber() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String NativePhoneNumber = null;
NativePhoneNumber = telephonyManager.getLine1Number();
return NativePhoneNumber;
}
/** 返回手机服务商名字 */
public static String getProvidersName() {
String ProvidersName = null;
// 返回唯一的用户ID;就是这张卡的编号神马的
String IMSI = getIMSI();
// IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。
if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {
ProvidersName = "中国移动";
} else if (IMSI.startsWith("46001")) {
ProvidersName = "中国联通";
} else if (IMSI.startsWith("46003")) {
ProvidersName = "中国电信";
} else {
ProvidersName = "其他服务商:" + IMSI;
}
return ProvidersName;
}
/** 获取当前设备的SN */
public static String getSimSN() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
String simSN = null;
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
simSN = tm.getSimSerialNumber();
} catch (Exception e) {
LogUtils.e(e);
}
return simSN;
}
/** 获取当前设备的MAC地址 */
public static String getMacAddress() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
String mac = null;
try {
WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wm.getConnectionInfo();
mac = info.getMacAddress();
} catch (Exception e) {
LogUtils.e(e);
}
return mac;
}
/** 获得设备ip地址 */
public static String getLocalAddress() {
try {
Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
while (en.hasMoreElements()) {
NetworkInterface intf = en.nextElement();
Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
while (enumIpAddr.hasMoreElements()) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
LogUtils.e(e);
}
return null;
}
/** 获取屏幕的分辨率 */
@SuppressWarnings("deprecation")
public static int[] getResolution() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
WindowManager windowMgr = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
int[] res = new int[2];
res[0] = windowMgr.getDefaultDisplay().getWidth();
res[1] = windowMgr.getDefaultDisplay().getHeight();
return res;
}
/**
* 得到屏幕的宽度
* @param mContext
* @return
*/
public static int getScreenWidth(){
Context context = UIUtils.getContext();
if (null == context) {
return 0;
}
DisplayMetrics dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
return dm.widthPixels;
}
/**
* 得到屏幕的高度
* @param mContext
* @return
*/
public static int getScreenHeight(){
Context context = UIUtils.getContext();
if (null == context) {
return 0;
}
DisplayMetrics dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
return dm.heightPixels;
}
/** 获得设备的横向dpi */
public static float getWidthDpi() {
Context context = UIUtils.getContext();
if (null == context) {
return 0;
}
DisplayMetrics dm = null;
try {
if (context != null) {
dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
}
return dm.densityDpi;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
/** 获得设备的纵向dpi */
public static float getHeightDpi() {
Context context = UIUtils.getContext();
if (null == context) {
return 0;
}
DisplayMetrics dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
return dm.ydpi;
}
/** 获取设备信息 */
public static String[] getDivceInfo() {
String str1 = "/proc/cpuinfo";
String str2 = "";
String[] cpuInfo = {"", ""};
String[] arrayOfString;
try {
FileReader fr = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
str2 = localBufferedReader.readLine();
arrayOfString = str2.split("\\s+");
for (int i = 2; i < arrayOfString.length; i++) {
cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " ";
}
str2 = localBufferedReader.readLine();
arrayOfString = str2.split("\\s+");
cpuInfo[1] += arrayOfString[2];
localBufferedReader.close();
} catch (IOException e) {
LogUtils.e(e);
}
return cpuInfo;
}
/** 判断手机CPU是否支持NEON指令集 */
public static boolean isNEON() {
boolean isNEON = false;
String cupinfo = getCPUInfos();
if (cupinfo != null) {
cupinfo = cupinfo.toLowerCase();
isNEON = cupinfo != null && cupinfo.contains("neon");
}
return isNEON;
}
/** 读取CPU信息文件,获取CPU信息 */
@SuppressWarnings("resource")
private static String getCPUInfos() {
String str1 = "/proc/cpuinfo";
String str2 = "";
StringBuilder resusl = new StringBuilder();
String resualStr = null;
try {
FileReader fr = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
while ((str2 = localBufferedReader.readLine()) != null) {
resusl.append(str2);
// String cup = str2;
}
if (resusl != null) {
resualStr = resusl.toString();
return resualStr;
}
} catch (IOException e) {
LogUtils.e(e);
}
return resualStr;
}
/** 获取当前设备cpu的型号 */
public static int getCPUModel() {
return matchABI(getSystemProperty("ro.product.cpu.abi")) | matchABI(getSystemProperty("ro.product.cpu.abi2"));
}
/** 匹配当前设备的cpu型号 */
private static int matchABI(String abiString) {
if (TextUtils.isEmpty(abiString)) {
return 0;
}
if ("armeabi".equals(abiString)) {
return 1;
} else if ("armeabi-v7a".equals(abiString)) {
return 2;
} else if ("x86".equals(abiString)) {
return 4;
} else if ("mips".equals(abiString)) {
return 8;
}
return 0;
}
/** 获取CPU核心数 */
public static int getCpuCount() {
return Runtime.getRuntime().availableProcessors();
}
/** 获取Rom版本 */
public static String getRomversion() {
String rom = "";
try {
String modversion = getSystemProperty("ro.modversion");
String displayId = getSystemProperty("ro.build.display.id");
if (modversion != null && !modversion.equals("")) {
rom = modversion;
}
if (displayId != null && !displayId.equals("")) {
rom = displayId;
}
} catch (Exception e) {
LogUtils.e(e);
}
return rom;
}
/** 获取系统配置参数 */
public static String getSystemProperty(String key) {
String pValue = null;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method m = c.getMethod("get", String.class);
pValue = m.invoke(null, key).toString();
} catch (Exception e) {
LogUtils.e(e);
}
return pValue;
}
/** 获取系统中的Library包 */
public static List<String> getSystemLibs() {
Context context = UIUtils.getContext();
if (null == context) {
return null;
}
PackageManager pm = context.getPackageManager();
String[] libNames = pm.getSystemSharedLibraryNames();
List<String> listLibNames = Arrays.asList(libNames);
LogUtils.d("SystemLibs: " + listLibNames);
return listLibNames;
}
/** 获取手机外部可用空间大小,单位为byte */
@SuppressWarnings("deprecation")
public static long getExternalTotalSpace() {
long totalSpace = -1L;
if (FileUtils.isSDCardAvailable()) {
try {
String path = Environment.getExternalStorageDirectory().getPath();// 获取外部存储目录即 SDCard
StatFs stat = new StatFs(path);
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
totalSpace = totalBlocks * blockSize;
} catch (Exception e) {
LogUtils.e(e);
}
}
return totalSpace;
}
/** 获取外部存储可用空间,单位为byte */
@SuppressWarnings("deprecation")
public static long getExternalSpace() {
long availableSpace = -1L;
if (FileUtils.isSDCardAvailable()) {
try {
String path = Environment.getExternalStorageDirectory().getPath();
StatFs stat = new StatFs(path);
availableSpace = stat.getAvailableBlocks() * (long) stat.getBlockSize();
} catch (Exception e) {
LogUtils.e(e);
}
}
return availableSpace;
}
/** 获取手机内部空间大小,单位为byte */
@SuppressWarnings("deprecation")
public static long getTotalInternalSpace() {
long totalSpace = -1L;
try {
String path = Environment.getDataDirectory().getPath();
StatFs stat = new StatFs(path);
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();// 获取该区域可用的文件系统数
totalSpace = totalBlocks * blockSize;
} catch (Exception e) {
LogUtils.e(e);
}
return totalSpace;
}
/** 获取手机内部可用空间大小,单位为byte */
@SuppressWarnings("deprecation")
public static long getAvailableInternalMemorySize() {
long availableSpace = -1l;
try {
String path = Environment.getDataDirectory().getPath();// 获取 Android 数据目录
StatFs stat = new StatFs(path);// 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况
long blockSize = stat.getBlockSize();// 返回 Int ,大小,以字节为单位,一个文件系统
long availableBlocks = stat.getAvailableBlocks();// 返回 Int ,获取当前可用的存储空间
availableSpace = availableBlocks * blockSize;
} catch (Exception e) {
LogUtils.e(e);
}
return availableSpace;
}
/** 获取单个应用最大分配内存,单位为byte */
public static long getOneAppMaxMemory() {
Context context = UIUtils.getContext();
if (context == null) {
return -1;
}
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
return activityManager.getMemoryClass() * 1024 * 1024;
}
/** 获取指定本应用占用的内存,单位为byte */
public static long getUsedMemory() {
return getUsedMemory(null);
}
/** 获取指定包名应用占用的内存,单位为byte */
public static long getUsedMemory(String packageName) {
Context context = UIUtils.getContext();
if (context == null) {
return -1;
}
if (StringUtils.isEmpty(packageName)) {
packageName = context.getPackageName();
}
long size = 0;
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runapps = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo runapp : runapps) { // 遍历运行中的程序
if (packageName.equals(runapp.processName)) {// 得到程序进程名,进程名一般就是包名,但有些程序的进程名并不对应一个包名
// 返回指定PID程序的内存信息,可以传递多个PID,返回的也是数组型的信息
Debug.MemoryInfo[] processMemoryInfo = activityManager.getProcessMemoryInfo(new int[]{runapp.pid});
// 得到内存信息中已使用的内存,单位是K
size = processMemoryInfo[0].getTotalPrivateDirty() * 1024;
}
}
return size;
}
/** 获取手机剩余内存,单位为byte */
public static long getAvailableMemory() {
Context context = UIUtils.getContext();
if (context == null) {
return -1;
}
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(info);
return info.availMem;
}
/** 获取手机总内存,单位为byte */
public static long getTotalMemory() {
long size = 0;
String path = "/proc/meminfo";// 系统内存信息文件
try {
String totalMemory = FileUtils.readProperties(path, "MemTotal", null);// 读出来是带单位kb的,并且单位前有空格,所以去掉最后三位
if (!StringUtils.isEmpty(totalMemory) && totalMemory.length() > 3) {
size = Long.valueOf(totalMemory.substring(0, totalMemory.length() - 3)) * 1024;
}
} catch (Exception e) {
LogUtils.e(e);
}
return size;
}
/** 手机低内存运行阀值,单位为byte */
public static long getThresholdMemory() {
Context context = UIUtils.getContext();
if (context == null) {
return -1;
}
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(info);
return info.threshold;
}
/** 手机是否处于低内存运行 */
public static boolean isLowMemory() {
Context context = UIUtils.getContext();
if (context == null) {
return false;
}
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(info);
return info.lowMemory;
}
/**
* 设置播放静音
*/
public static void setVolumeSilence(){
Context context = UIUtils.getContext();
if (context == null) {
return ;
}
//音量控制,初始化定义
AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
////最大音量
// int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
////当前音量
// int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
}
/**
* 取消静音
*/
public static void setVolumeNormal(){
Context context = UIUtils.getContext();
if (context == null) {
return ;
}
//音量控制,初始化定义
AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);
}
}