android设备信息获取处理

 

计算设备尺寸:
public static double getScreenPhysicalSize(Activity ctx) {
        DisplayMetrics dm = new DisplayMetrics();
        ctx.getWindowManager().getDefaultDisplay().getMetrics(dm);
        double diagonalPixels = Math.sqrt(Math.pow(dm.widthPixels, 2) + Math.pow(dm.heightPixels, 2));
        return diagonalPixels / (160 * dm.density);
    }
    
   判断设备是否为平板

 public static boolean isTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
    }

 获取mac

public static String getDeviceMac(Context appContext){
        String macAddress = null ;
        WifiManager wifiManager =
                (WifiManager)appContext.getSystemService(Context.WIFI_SERVICE);

        WifiInfo info = ( null == wifiManager ? null : wifiManager.getConnectionInfo());
        if (!wifiManager.isWifiEnabled()){//必须先打开,才能获取到MAC地址
            wifiManager.setWifiEnabled(true);
        }
        if (null != info) {
            macAddress = info.getMacAddress();
        }

        if(!TextUtils.isEmpty(macAddress) && false==macAddress.startsWith("02:00:00"))
        return macAddress;
        //解决部分机型关闭wifi时,获取到02:00:00 mac不准确
        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) {
            ex.printStackTrace();
        }
        return "02:00:00:00:00:01";
    }

 

android 获取设备型号、OS版本号:
    Build bd = new Build();  
    String model = bd.MODEL;
    android.os.Build.MODEL

   android.os.Build.SERIAL;
    android.os.Build.VERSION.RELEASE

获取系统语言环境:
Locale.getDefault().getLanguage();  
language=Locale.getDefault().toString();//en_US zh_CN 

 

获取状态栏和标题栏的高度
获取状态栏高度:
getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。
于是,我们就可以算出状态栏的高度了。
Rect frame = new Rect();  
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
int statusBarHeight = frame.top;


获取标题栏高度:
getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();  
//statusBarHeight是上面所求的状态栏的高度  
int titleBarHeight = contentTop - statusBarHeight  

通过反射机制获取通知栏高度

public static int getStatusBarHeight(Context context){
        Class<?> c = null;
        Object obj = null;
        Field field = null;
        int x = 0, statusBarHeight = 0;
        try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            statusBarHeight = context.getResources().getDimensionPixelSize(x);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return statusBarHeight;
    }

 
屏幕分辨率

private void initDisplayMetrics(){
        DisplayMetrics dm=new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        this.width=dm.widthPixels;
        this.height=dm.heightPixels;
}

 屏幕密度相关

    //https://developer.android.google.cn/guide/practices/screens_support.html
    void testShowDeviceInfo(){
        Resources res = getResources();
        DisplayMetrics displayMetrics = res.getDisplayMetrics();
        int density = displayMetrics.densityDpi;//屏幕密度
        int sw = res.getConfiguration().smallestScreenWidthDp;//适配最小横向dp值(例如:layout-sw600dp)
        //Get the screen's density scale
        float scale = displayMetrics.density;//屏幕拉伸比例系数
        StringBuilder buf = new StringBuilder();
        buf.append("scale factor:").append(scale).append(" smallest screen size:").append(sw)
        .append(" current densityDpi:").append(density).append(" width x height:")
                .append(displayMetrics.widthPixels).append(" x ").append(displayMetrics.heightPixels);

        TextView tvTitle = findViewById(R.id.tvHeadLine);
        tvTitle.setText(buf.toString());
        switch (density) {//密度对应资源匹配
            case DisplayMetrics.DENSITY_MEDIUM:
                break;
            case DisplayMetrics.DENSITY_HIGH:
                break;
            case DisplayMetrics.DENSITY_TV:
                break;
            case DisplayMetrics.DENSITY_XHIGH:
                break;
            case DisplayMetrics.DENSITY_XXHIGH:
                break;
            case DisplayMetrics.DENSITY_XXXHIGH:
                break;
        }

    }

 


获取内存信息:
ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(outInfo);
//可用内存
outInfo.availMem
//是否在低内存状态
outInfo.lowMemory

使用Java获取系统内存信息;

void memery(){
    String m1=(Runtime.getRuntime().maxMemory()/ (1024 * 1024)) + "MB" ;
    String m2=(Runtime.getRuntime().totalMemory()/ (1024 * 1024)) + "MB" ;
    String m3=(Runtime.getRuntime().freeMemory()/ (1024 * 1024)) + "MB"  ;
    System.out.println("MaxMemory= "+m1+" totalMemory= "+m2+" freeMemory= "+m3);
}

 
ActivityManager mActManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
/** 获得系统正在运行的进程. */
List<RunningAppProcessInfo> mAllSysAppProcesses = mActManager.getRunningAppProcesses();

  
   获取设备ip地址字符串形式表示

public String getLocalIpAddress() {  
    String strIP=null;  
       try {  
           for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {  
               NetworkInterface intf = en.nextElement();  
               for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {  
                   InetAddress inetAddress = enumIpAddr.nextElement();  
                   if (!inetAddress.isLoopbackAddress()) {  
                    strIP= inetAddress.getHostAddress().toString();  
                   }  
               }  
           }  
       } catch (SocketException ex) {  
           Log.e("msg", ex.toString());  
       }  
       return strIP;  
   }  

 

获取Android设备的唯一识别码。由于设备杂乱,为了保证设备号唯一性,可以采用获取UUID方式。

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
    final String tmDevice, tmSerial, tmPhone, androidId;
    tmDevice = "" + tm.getDeviceId();
    tmSerial = "" + tm.getSimSerialNumber();
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String uniqueId = deviceUuid.toString();

所有的设备都可以返回一个 TelephonyManager.getDeviceId()
所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()
所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值!
所有添加有谷歌账户的设备可以返回一个 ANDROID_ID
所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添加了谷歌账户)


//获取电池电量:

Intent batteryIntent = getApplicationContext().registerReceiver(null,  
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);  
int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);  
int percent = currLevel * 100 / total;  

 //或者
private BroadcastReceiver batteryReceiver=new BroadcastReceiver(){  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            int level = intent.getIntExtra("level", 0);  
            //  level加%就是当前电量了  
    }  
    };  
    registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

 



//开机时间:

private String getOpenDeviceTimes() {  
    long ut = SystemClock.elapsedRealtime() / 1000;  
    if (ut == 0) {  
        ut = 1;  
    }  
    int m = (int) ((ut / 60) % 60);  
    int h = (int) ((ut / 3600));  
    return h + " " + mContext.getString(R.string.info_times_hour) + m + " "  
            + mContext.getString(R.string.info_times_minute);  
}  

 




获取CPU信息:
/proc/cpuinfo文件中第一行是CPU的型号,第二行是CPU的频率

public String[] getCpuInfo() {  
    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;  
}  

 

获取simCard相关:
/**
     * Role:获取当前设置的电话号码
     * <BR>Date:2012-3-12
     * <BR>@author CODYY)peijiangping
     */
    public String getNativePhoneNumber() {
        String NativePhoneNumber=null;
        NativePhoneNumber=telephonyManager.getLine1Number();
        return NativePhoneNumber;
    }

    /**
     * Role:Telecom service providers获取手机服务商信息 <BR>
     * 需要加入权限<uses-permission
     * android:name="android.permission.READ_PHONE_STATE"/> <BR>
     * Date:2012-3-12 <BR>
     *
     * @author CODYY)peijiangping
     */
    public String getProvidersName() {
        String ProvidersName = null;
        // 返回唯一的用户ID;就是这张卡的编号神马的
        IMSI = telephonyManager.getSubscriberId();
        // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。
        System.out.println(IMSI);
        if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {
            ProvidersName = "中国移动";
        } else if (IMSI.startsWith("46001")) {
            ProvidersName = "中国联通";
        } else if (IMSI.startsWith("46003")) {
            ProvidersName = "中国电信";
        }
        return ProvidersName;
    }

     
    获取存储可用空间:

private static final double KB = 1024.0;  
	    private static final double MB = KB * KB;  
	    private static final double GB = KB * KB * KB;  
	      
	    private static String showFileSize(double size) {  
	        String fileSize;  
	        if (size < KB)  
	            fileSize = size + "B";  
	        else if (size < MB)  
	            fileSize = String.format("%.3f", size / KB) + "KB";  
	        else if (size < GB)  
	            fileSize = String.format("%.3f", size / MB) + "MB";  
	        else  
	            fileSize = String.format("%.3f", size / GB) + "GB";  
	      
	        return fileSize;  
	    }  
	    /** 显示SD卡剩余空间 */  
	    public static String getSdcardAvailable() {  
	        String result = "";  
	        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {  
	            StatFs sf = new StatFs("/mnt/sdcard");  
	            long blockSize = sf.getBlockSize();  
	            long blockCount = sf.getBlockCount();  
	            long availCount = sf.getAvailableBlocks();  
	            return showFileSize(availCount * blockSize) + " \\ " + showFileSize(blockSize * blockCount);  
	        }  
	        return result;  
	    }  
	    
	    /**
	     * 获取手机内部可用空间大小
	     * @return
	     */
	    static public long getAvailableInternalMemorySize() {
	        File path = Environment.getDataDirectory();
	        StatFs stat = new StatFs(path.getPath());
	        long blockSize = stat.getBlockSize();
	        long availableBlocks = stat.getAvailableBlocks();
	        return availableBlocks * blockSize;
	    }

	    /**
	     * 获取手机内部空间大小
	     * @return
	     */
	    static public long getTotalInternalMemorySize() {
	        File path = Environment.getDataDirectory();
	        StatFs stat = new StatFs(path.getPath());
	        long blockSize = stat.getBlockSize();
	        long totalBlocks = stat.getBlockCount();
	        return totalBlocks * blockSize;
	    }

 
获取内存使用情况:

 public static String getMemoryUsage() {
        ActivityManager activityManager = (ActivityManager) DscaApplication.AppContext.getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
        activityManager.getMemoryInfo(memoryInfo);
        long availMemory = memoryInfo.availMem / ONE_M_TO_BYTE;
        long totalMemory = memoryInfo.totalMem / ONE_M_TO_BYTE;
       
        return availMemory + "M/" + totalMemory + "M";
    }

 


 


 

posted @ 2016-05-03 17:06  HappyCode002  阅读(250)  评论(0编辑  收藏  举报