天天看点

获取手机的一些信息

获取手机的一些信息

获取手机上的信息,如手机型号,手机系统,本机密码等信息。
           
代码如下
package com.example.admin.phonemessagedemo;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
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 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;

/**
* Created by admin on 2017/3/23.
*/
public class DevicesUtil {
/**
 * 获取手机型号
 */
public static String getDeviceModel() {
    return android.os.Build.MODEL;
}

/**
 * 获取手机os系统
 */
public static String getDeviceOsVersion() {
    return android.os.Build.VERSION.RELEASE;
}

/**
 * 获取设备的IMEI
 */
public static String getIMEI() {
    Context context = BaseApplication.getInstance();
    if (null == context) {
        return null;
    }
    String imei = null;
    try {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        imei = tm.getDeviceId();
    } catch (Exception e) {
    }
    return imei;
}

/**
 * 获取当前设备的SN
 */
public static String getSimSN() {
    Context context = BaseApplication.getInstance();
    if (null == context) {
        return null;
    }
    String simSN = null;
    try {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        simSN = tm.getSimSerialNumber();
    } catch (Exception e) {
    }
    return simSN;
}

/**
 * 获取当前设备的MAC地址
 */
public static String getMacAddress() {
    Context context = BaseApplication.getInstance();
    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) {
    }
    return mac;
}

/**
 * 检测手机是否已插入SIM卡
 */
public static boolean isCheckSimCardAvailable() {
    Context context = BaseApplication.getInstance();
    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 = BaseApplication.getInstance();
    if (null == context) {
        return false;
    }
    try {
        TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return TelephonyManager.SIM_STATE_READY == mgr.getSimState();
    } catch (Exception e) {

    }
    return false;
}

/**
 * 取得当前sim手机卡的imsi
 */
public static String getIMSI() {
    Context context = BaseApplication.getInstance();
    if (null == context) {
        return null;
    }
    String imsi = null;
    try {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        imsi = tm.getSubscriberId();
    } catch (Exception e) {

    }
    return imsi;
}

/**
 * 返回本地手机号码,这个号码不一定能获取到
 */
public static String getNativePhoneNumber(Context context) {
    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();
    if (TextUtils.isEmpty(IMSI)) {
        return "其他服务商:" + IMSI;
    }
    // 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;
}


/**
 * 获得设备ip地址
 */
public static String getLocalIPAddress() {
    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) {

    }
    return null;
}

/**
 * 获取设备信息
 */
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) {

    }
    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) {

    }
    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) {

    }
    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) {

    }
    return pValue;
}

/**
 * 获取系统中的Library包
 */
public static List<String> getSystemLibs() {
    Context context = BaseApplication.getInstance();
    if (null == context) {
        return null;
    }
    PackageManager pm = context.getPackageManager();
    String[] libNames = pm.getSystemSharedLibraryNames();
    List<String> listLibNames = Arrays.asList(libNames);
    return listLibNames;
}

/**
 * 获取手机外部总空间大小
 *
 * @return 大小(单位:字节)
 */
@SuppressWarnings("deprecation")
public static long getTotalExternalMemorySize() {
    long totalSpace = -1L;
    if (isSDCardMounted()) {
        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) {
        }
    }
    return totalSpace;
}

/**
 * 获取手机外部可用空间大小
 *
 * @return 大小(单位:字节)
 */
@SuppressWarnings("deprecation")
public static long getAvailableExternalMemorySize() {
    long availableSpace = -1L;
    if (isSDCardMounted()) {
        try {
            String path = Environment.getExternalStorageDirectory().getPath();
            StatFs stat = new StatFs(path);
            availableSpace = stat.getAvailableBlocks() * (long) stat.getBlockSize();
        } catch (Exception e) {
        }
    }
    return availableSpace;
}

/**
 * 获取手机内部总空间大小
 *
 * @return 大小(单位:字节)
 */
@SuppressWarnings("deprecation")
public static long getTotalInternalMemorySize() {
    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) {

    }
    return totalSpace;
}

/**
 * 获取手机内部可用空间大小
 *
 * @return 大小(单位:字节)
 */
@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) {

    }
    return availableSpace;
}

/**
 * 获取单个应用最大分配内存,单位为byte
 */
public static long getOneAppMaxMemory() {
    Context context = BaseApplication.getInstance();
    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 = BaseApplication.getInstance();
    if (context == null) {
        return -1;
    }
    if (TextUtils.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 = BaseApplication.getInstance();
    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 getThresholdMemory() {
    Context context = BaseApplication.getInstance();
    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 = BaseApplication.getInstance();
    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;
}

/**
 * 是否装载了SD卡
 *
 * @return 是否装载
 */
private static boolean isSDCardMounted() {
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
        return true;
    else
        return false;
}
}
           

补充:

因为6.0增加了权限管理,用上述获取mac的方法在6.0的系统上将默认返回02:00:00:00:00:00,下面补充一种万能的方法,在6.0和低版本的手机上都能获取到mac地址的方法,亲测有效。

public String getMacAddr() {
    try {
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface nif : all) {
            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;

            byte[] macBytes = nif.getHardwareAddress();
            if (macBytes == null) {
                return "";
            }

            StringBuilder res1 = new StringBuilder();
            for (byte b : macBytes) {
                res1.append(String.format("%02X:",b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
    }
    return "02:00:00:00:00:00";
}
           

注意

并不是所有的信息都可以获得的,根据手机型号、系统、用户权限设置的不同,可能有些设备能获得,有些获取不到。