Android-DeviceUtil及状态栏高度获取

package com.example.lenovo.mysmartrefresh.mypermission;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.os.Build;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;

/**
 * Created by lenovo on 2017/7/25.
 */

public class DeviceUtil {

    /**
     * 获取DisplayMetrics
     *
     * @param context
     * @return
     */
    private static DisplayMetrics obtain(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        return dm;
    }

    /**
     * 获取屏幕宽度
     *
     * @param context
     * @return
     */
    public static int getDeviceWidth(Context context) {
        DisplayMetrics outMetrics = obtain(context);
        return outMetrics.widthPixels;
    }

    /**
     * 获取屏幕高度
     *
     * @param context
     * @return
     */
    public static int getDeviceHeight(Context context) {
        DisplayMetrics outMetrics = obtain(context);
        return outMetrics.heightPixels;
    }

    /**
     * 获取屏幕大小[0]宽,[1]高
     *
     * @param context
     * @return
     */
    public static int[] getDeviceResolution(Context context) {
        DisplayMetrics outMetrics = obtain(context);
        int[] sizes = new int[2];
        sizes[0] = outMetrics.widthPixels;
        sizes[1] = outMetrics.heightPixels;
        return sizes;
    }

    /**
     * 获取设备屏幕密度dpi,每寸所包含的像素点
     *
     * @param context
     * @return
     */
    public static float getDeviceDensityDpi(Context context) {
        return context.getResources().getDisplayMetrics().densityDpi;
    }

    /**
     * 获取设备屏幕密度,像素的比例
     *
     * @param context
     * @return
     */
    public static float getDeviceDensity(Context context) {
        return context.getResources().getDisplayMetrics().density;
    }

    /**
     * 获取状态栏高度
     *
     * @param context
     * @return
     */
    public static int getStatusHeight(Context context) {
        int statusHeight = -1;
        try {
            Class<?> clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            int height = Integer.parseInt(clazz.getField("status_bar_height")
                    .get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;
    }

    /**
     * 截取当前屏幕画面为bitmap图片
     *
     * @param activity
     * @param hasStatusBar 是否包含当前状态栏,true:包含
     * @return
     */
    public static Bitmap snapCurrentScreenShot(Activity activity, boolean hasStatusBar) {
        View decorView = activity.getWindow().getDecorView();
        decorView.setDrawingCacheEnabled(true);
        decorView.buildDrawingCache();
        Bitmap bmp = decorView.getDrawingCache();
        int deviceSize[] = getDeviceResolution(activity);
        int coordinateY = 0;
        int cutHeight = deviceSize[1];
        if (!hasStatusBar) {
            Rect frame = new Rect();
            decorView.getWindowVisibleDisplayFrame(frame);
            coordinateY += frame.top;
            cutHeight -= frame.top;
        }
        Bitmap shot = Bitmap.createBitmap(bmp, 0, coordinateY, deviceSize[0], cutHeight);
        decorView.destroyDrawingCache();
        return shot;
    }

    /*---------------------------------------手机信息--------------------------------------------*/

    /**
     * 获取手机IMEI号
     * add <uses-permission android:name="android.permission.READ_PHONE_STATE" /> in AndroidManifest.xml
     *
     * @param context
     * @return getDeviceId
     */
    public static String getDeviceIMEI(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getDeviceId();
    }

    /**
     * 获取手机imsi号
     * add <uses-permission android:name="android.permission.READ_PHONE_STATE" /> in AndroidManifest.xml
     *
     * @param context
     * @return getSubscriberId
     */
    public static String getDeviceIMSI(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSubscriberId();
    }

    /**
     * 获取手机号
     * add <uses-permission android:name="android.permission.READ_PHONE_STATE" /> in AndroidManifest.xml
     *
     * @param context
     * @return
     */
    public static String getDeviceLine1Number(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getLine1Number();
    }

    /**
     * 获取手机SimSerialNumber号
     * add <uses-permission android:name="android.permission.READ_PHONE_STATE" /> in AndroidManifest.xml
     *
     * @param context
     * @return
     */
    public static String getDeviceSimSerialNumber(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSimSerialNumber();
    }

    /**
     * 服务商名称:
     * 例如:中国移动、联通
     * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
     *
     * @param context
     * @return getSimOperatorName
     */
    public static String getDeviceSimOperatorName(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSimOperatorName();
    }

    /*
     * 手机类型:
     * 例如: PHONE_TYPE_NONE  无信号
       PHONE_TYPE_GSM   GSM信号
       PHONE_TYPE_CDMA  CDMA信号
     *
     * @param context
     * @return getPhoneType
     */
    public static int getDevicePhoneType(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getPhoneType();
    }

    /*
     * 设备的软件版本号:
     * 例如:the IMEI/SV(software version) for GSM phones.
     * Return null if the software version is not available.
     */
    public static String getDeviceDeviceSoftwareVersion(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getDeviceSoftwareVersion();
    }

    /*
     * 当前使用的网络类型:
     * 例如: NETWORK_TYPE_UNKNOWN  网络类型未知  0
       NETWORK_TYPE_GPRS     GPRS网络  1
       NETWORK_TYPE_EDGE     EDGE网络  2
       NETWORK_TYPE_UMTS     UMTS网络  3
       NETWORK_TYPE_HSDPA    HSDPA网络  8
       NETWORK_TYPE_HSUPA    HSUPA网络  9
       NETWORK_TYPE_HSPA     HSPA网络  10
       NETWORK_TYPE_CDMA     CDMA网络,IS95A 或 IS95B.  4
       NETWORK_TYPE_EVDO_0   EVDO网络, revision 0.  5
       NETWORK_TYPE_EVDO_A   EVDO网络, revision A.  6
       NETWORK_TYPE_1xRTT    1xRTT网络  7
     */
    public static int getDeviceNetworkType(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getNetworkType();
    }

    /*
     * Returns the ISO country code equivalent for the SIM provider's country code.
     * 获取ISO国家码,相当于提供SIM卡的国家码。
     *
     *
     * @param context
     * @return getSimCountryIso
     */
    public static String getDeviceSimCountryIso(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSimCountryIso();
    }

    /*
       * SIM的状态信息:
       * SIM_STATE_UNKNOWN          未知状态 0
       * SIM_STATE_ABSENT           没插卡 1
       * SIM_STATE_PIN_REQUIRED     锁定状态,需要用户的PIN码解锁 2
       * SIM_STATE_PUK_REQUIRED     锁定状态,需要用户的PUK码解锁 3
       * SIM_STATE_NETWORK_LOCKED   锁定状态,需要网络的PIN码解锁 4
       * SIM_STATE_READY            就绪状态 5
       *
       * @param context
       * @return getSimState
       */
    public static int getDeviceSimState(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSimState();
    }

    /**
     * 电话状态:
     * 1.tm.CALL_STATE_IDLE=0     无活动
     * 2.tm.CALL_STATE_RINGING=1  响铃
     * 3.tm.CALL_STATE_OFFHOOK=2  摘机
     *
     * @param context
     * @return getCallState
     */
    public static int getDeviceCallState(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getCallState();
    }

    /*
    * 是否漫游:
    * (在GSM用途下)
    */
    public static boolean getDeviceIsNetworkRoaming(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.isNetworkRoaming();
    }

    /*
      * ICC卡是否存在
      */
    public static boolean getDeviceHasIccCard(Context context) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.hasIccCard();
    }

    /**
     * 获取手机厂商
     *
     * @return
     */
    public static String getDeviceManufacturer() {
        return Build.MANUFACTURER;
    }

    /**
     * 获取手机ROM
     *
     * @return
     */
    public static String getDeviceRom() {
        return Build.DISPLAY;
    }

    /**
     * 获取手机型号
     *
     * @return
     */
    public static String getDeviceModel() {
        return Build.MODEL;
    }

    /**
     * 获取手机系统版本号
     *
     * @return
     */
    public static String getDeviceSystemVersion() {
        return Build.VERSION.RELEASE;
    }

    /*--------------------------------------------单位转换---------------------------------------------*/

    /**
     * 将px值转变成dip
     *
     * @param context
     * @param px
     * @return
     */
    public static float pxToDip(Context context, float px) {
        return px / getDeviceDensity(context) + 0.5f;
    }

    /**
     * 将dip值转成px
     *
     * @param context
     * @param dip
     * @return
     */
    public static float dipToPx(Context context, float dip) {
        return dip * getDeviceDensity(context) + 0.5f;
    }

    /**
     * 将px值转成sp值
     *
     * @param context
     * @param px
     * @return
     */
    public static float pxToSp(Context context, float px) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return px / fontScale + 0.5f;
    }

    /**
     * 将sp值转成px值
     *
     * @param context
     * @param sp
     * @return
     */
    public static float spTpPx(Context context, float sp) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return sp * fontScale + 0.5f;
    }

    /*--------------------------------------------APP版本相关---------------------------------------------*/

    /**
     * 获取软件versionName
     *
     * @param context
     * @return
     */
    public static String getSoftVersionName(Context context) {
        PackageInfo info = null;
        try {
            info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "1.0";
    }

    /**
     * 获取软件VersionCode
     *
     * @param context
     * @return
     */
    public static int getSoftVersionCode(Context context) {
        PackageInfo info = null;
        try {
            info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 1;
    }
    /*----------------------------------------------------------------------------------------*/

}

调用测试(手机:华为Nova2)

   /*
        * 手机参数
        * */
        String deviceIMEI = DeviceUtil.getDeviceIMEI(this);
        String deviceIMSI = DeviceUtil.getDeviceIMSI(this);
        String deviceLine1Number = DeviceUtil.getDeviceLine1Number(this);
        String deviceManufacturer = DeviceUtil.getDeviceManufacturer();
        String deviceModel = DeviceUtil.getDeviceModel();
        String deviceRom = DeviceUtil.getDeviceRom();
        String deviceSimSerialNumber = DeviceUtil.getDeviceSimSerialNumber(this);
        int deviceCallState = DeviceUtil.getDeviceCallState(this);

        Log.e("PermissionActivity","deviceIMEI=="+deviceIMEI);
        Log.e("PermissionActivity","deviceIMSI=="+deviceIMSI);
        Log.e("PermissionActivity","deviceLine1Number=="+deviceLine1Number);//+86+手机号
        Log.e("PermissionActivity","deviceManufacturer=="+deviceManufacturer);//生产商:HUAWEI
        Log.e("PermissionActivity","deviceModel=="+deviceModel);//型号:PIC-AL00
        Log.e("PermissionActivity","deviceRom=="+deviceRom);//版本号:PIC-AL00C00B133
        Log.e("PermissionActivity","deviceSimSerialNumber=="+deviceSimSerialNumber);//序列号
        Log.e("PermissionActivity","deviceCallState=="+deviceCallState);//0

        /*
        * 屏幕相关
        * */
        int deviceWidth = DeviceUtil.getDeviceWidth(this);
        int deviceHeight = DeviceUtil.getDeviceHeight(this);
        float deviceDensity = DeviceUtil.getDeviceDensity(this);
        float deviceDensityDpi = DeviceUtil.getDeviceDensityDpi(this);
        int statusHeight = DeviceUtil.getStatusHeight(this);


        Log.e("PermissionActivity","deviceWidth=="+deviceWidth);//1080
        Log.e("PermissionActivity","deviceHeight=="+deviceHeight);//1812
        Log.e("PermissionActivity","deviceDensity=="+deviceDensity);//3.0
        Log.e("PermissionActivity","deviceDensityDpi=="+deviceDensityDpi);//480.0
        Log.e("PermissionActivity","statusHeight=="+statusHeight);//72

        /*
        * 版本相关
        * */
        int softVersionCode = DeviceUtil.getSoftVersionCode(this);
        String softVersionName = DeviceUtil.getSoftVersionName(this);
        String deviceSystemVersion = DeviceUtil.getDeviceSystemVersion();

        Log.e("PermissionActivity","softVersionCode=="+softVersionCode);//1
        Log.e("PermissionActivity","softVersionName=="+softVersionName);//1.0
        Log.e("PermissionActivity","deviceSystemVersion=="+deviceSystemVersion);//android系统版本:7.0

其他:

  /**
     * 通过反射的方式获取状态栏高度
     *
     * @return
     */
    private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object obj = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }


/**
     * 获取状态栏高度, 单位px
     * 
     * @param context
     * @return
     */
    public static int getStatusBarHeight(Context context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

    /**
     * 获取actionbar高度, 单位px
     * 
     * @param context
     * @return
     */
    public static int getActionBarHeight(Context context) {
        TypedValue localTypedValue = new TypedValue();
        if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, localTypedValue, true)) {
            return TypedValue.complexToDimensionPixelSize(localTypedValue.data, context.getResources().getDisplayMetrics());
        }
        return 0;
    }


     /**
     * 获取actionbar的高度
     * 
     * @return
     */
    private float getActionBarHeight() {
        TypedArray actionbarSizeTypedArray = this.obtainStyledAttributes(new int[] {android.R.attr.actionBarSize});
        float h = actionbarSizeTypedArray.getDimension(0, 0);
        actionbarSizeTypedArray.recycle();
        return h;
    }

猜你喜欢

转载自blog.csdn.net/sinat_31057219/article/details/76215963