您的位置:首页 > 移动开发 > Android开发

Android-DeviceUtil及状态栏高度获取

2017-07-27 18:25 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: