在自定义View中必须用到这个方法。自定义View的时候,不能像在xml那样可以设置dp(密度),只能设置px(像素)。不同分辨率的设备,设置px,显示就不会一样了。为了结合设计图设置dp,需要将dp转换为px值,然后再设置。
/** * dp 转化为 px * @param context * @param dpValue * @return */
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/** * px 转化为 dp * @param context * @param pxValue * @return */
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/** * 获取设备宽度(px) * @param context * @return */
public static int deviceWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
/** * 获取设备高度(px) * @param context * @return */
public static int deviceHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
/** * SD卡判断 * @return */
public static boolean isSDCardAvailable() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/** * 是否有网 * @param context * @return */
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
对应build.gradle中的versionName
/** * 返回版本名字 * 对应build.gradle中的versionName * * @param context * @return */
public static String getVersionName(Context context) {
String versionName = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return versionName;
}
对应build.gradle中的versionCode
/** * 返回版本号 * 对应build.gradle中的versionCode * * @param context * @return */
public static String getVersionCode(Context context) {
String versionCode = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionCode = String.valueOf(packInfo.versionCode);
} catch (Exception e) {
e.printStackTrace();
}
return versionCode;
}
每台设备都有唯一的标识,这就是DeviceId
/** * 获取设备的唯一标识,deviceId * * @param context * @return */
public static String getDeviceId(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId();
if (deviceId == null) {
return "-";
} else {
return deviceId;
}
}
/** * 获取手机品牌 * * @return */
public static String getPhoneBrand() {
return android.os.Build.BRAND;
}
/** * 获取手机型号 * * @return */
public static String getPhoneModel() {
return android.os.Build.MODEL;
}
/** * 获取手机Android API等级(22、23 ...) * * @return */
public static int getBuildLevel() {
return android.os.Build.VERSION.SDK_INT;
}
/** * 获取手机Android 版本(4.4、5.0、5.1 ...) * * @return */
public static String getBuildVersion() {
return android.os.Build.VERSION.RELEASE;
}
/** * 获取当前App进程的id * * @return */
public static int getAppProcessId() {
return android.os.Process.myPid();
}
/** * 获取当前App进程的Name * * @param context * @param processId * @return */
public static String getAppProcessName(Context context, int processId) {
String processName = null;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// 获取所有运行App的进程集合
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = context.getPackageManager();
while (i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
try {
if (info.pid == processId) {
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
processName = info.processName;
return processName;
}
} catch (Exception e) {
Log.e(DeviceUtil.class.getName(), e.getMessage(), e);
}
}
return processName;
}
/** * 创建App文件夹 * * @param appName * @param application * @return */
public static String createAPPFolder(String appName, Application application) {
return createAPPFolder(appName, application, null);
}
/** * 创建App文件夹 * * @param appName * @param application * @param folderName * @return */
public static String createAPPFolder(String appName, Application application, String folderName) {
File root = Environment.getExternalStorageDirectory();
File folder;
/** * 如果存在SD卡 */
if (DeviceUtil.isSDCardAvailable() && root != null) {
folder = new File(root, appName);
if (!folder.exists()) {
folder.mkdirs();
}
} else {
/** * 不存在SD卡,就放到缓存文件夹内 */
root = application.getCacheDir();
folder = new File(root, appName);
if (!folder.exists()) {
folder.mkdirs();
}
}
if (folderName != null) {
folder = new File(folder, folderName);
if (!folder.exists()) {
folder.mkdirs();
}
}
return folder.getAbsolutePath();
}
/** * 通过Uri找到File * * @param context * @param uri * @return */
public static File uri2File(Activity context, Uri uri) {
File file;
String[] project = {MediaStore.Images.Media.DATA};
Cursor actualImageCursor = context.getContentResolver().query(uri, project, null, null, null);
if (actualImageCursor != null) {
int actual_image_column_index = actualImageCursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualImageCursor.moveToFirst();
String img_path = actualImageCursor
.getString(actual_image_column_index);
file = new File(img_path);
} else {
file = new File(uri.getPath());
}
if (actualImageCursor != null) actualImageCursor.close();
return file;
}
AndroidManifest.xml
比如自定义了一个meta-data
,名为DEBUG。
<meta-data
android:name="DEBUG"
android:value="${DEBUG}" />
build.gradle
然后在build.gradle里给这个DEBUG赋值了。
//渠道Flavors
productFlavors {
APPTest {
applicationId "com.zyy.camnter.newlife"
manifestPlaceholders = [DEBUG : "debug"]
}
}
可以通过一下方法取得AndroidManifest.xml里DEBUG被赋上的值:
/** * 获取AndroidManifest.xml里 <meta-data>的值 * * @param context * @param name * @return */
public static String getMetaData(Context context, String name) {
String value = null;
try {
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
value = appInfo.metaData.getString(name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}
public class DeviceUtil {
/** * dp 转化为 px * * @param context * @param dpValue * @return */
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/** * px 转化为 dp * * @param context * @param pxValue * @return */
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/** * 获取设备宽度(px) * * @param context * @return */
public static int deviceWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
/** * 获取设备高度(px) * * @param context * @return */
public static int deviceHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
/** * SD卡判断 * * @return */
public static boolean isSDCardAvailable() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/** * 是否有网 * * @param context * @return */
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
/** * 返回版本名字 * 对应build.gradle中的versionName * * @param context * @return */
public static String getVersionName(Context context) {
String versionName = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packInfo.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return versionName;
}
/** * 返回版本号 * 对应build.gradle中的versionCode * * @param context * @return */
public static String getVersionCode(Context context) {
String versionCode = "";
try {
PackageManager packageManager = context.getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionCode = String.valueOf(packInfo.versionCode);
} catch (Exception e) {
e.printStackTrace();
}
return versionCode;
}
/** * 获取设备的唯一标识,deviceId * * @param context * @return */
public static String getDeviceId(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId();
if (deviceId == null) {
return "-";
} else {
return deviceId;
}
}
/** * 获取手机品牌 * * @return */
public static String getPhoneBrand() {
return android.os.Build.BRAND;
}
/** * 获取手机型号 * * @return */
public static String getPhoneModel() {
return android.os.Build.MODEL;
}
/** * 获取手机Android API等级(22、23 ...) * * @return */
public static int getBuildLevel() {
return android.os.Build.VERSION.SDK_INT;
}
/** * 获取手机Android 版本(4.4、5.0、5.1 ...) * * @return */
public static String getBuildVersion() {
return android.os.Build.VERSION.RELEASE;
}
/** * 获取当前App进程的id * * @return */
public static int getAppProcessId() {
return android.os.Process.myPid();
}
/** * 获取当前App进程的Name * * @param context * @param processId * @return */
public static String getAppProcessName(Context context, int processId) {
String processName = null;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// 获取所有运行App的进程集合
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = context.getPackageManager();
while (i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
try {
if (info.pid == processId) {
CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
processName = info.processName;
return processName;
}
} catch (Exception e) {
Log.e(DeviceUtil.class.getName(), e.getMessage(), e);
}
}
return processName;
}
/** * 创建App文件夹 * * @param appName * @param application * @return */
public static String createAPPFolder(String appName, Application application) {
return createAPPFolder(appName, application, null);
}
/** * 创建App文件夹 * * @param appName * @param application * @param folderName * @return */
public static String createAPPFolder(String appName, Application application, String folderName) {
File root = Environment.getExternalStorageDirectory();
File folder;
/** * 如果存在SD卡 */
if (DeviceUtil.isSDCardAvailable() && root != null) {
folder = new File(root, appName);
if (!folder.exists()) {
folder.mkdirs();
}
} else {
/** * 不存在SD卡,就放到缓存文件夹内 */
root = application.getCacheDir();
folder = new File(root, appName);
if (!folder.exists()) {
folder.mkdirs();
}
}
if (folderName != null) {
folder = new File(folder, folderName);
if (!folder.exists()) {
folder.mkdirs();
}
}
return folder.getAbsolutePath();
}
/** * 通过Uri找到File * * @param context * @param uri * @return */
public static File uri2File(Activity context, Uri uri) {
File file;
String[] project = {MediaStore.Images.Media.DATA};
Cursor actualImageCursor = context.getContentResolver().query(uri, project, null, null, null);
if (actualImageCursor != null) {
int actual_image_column_index = actualImageCursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualImageCursor.moveToFirst();
String img_path = actualImageCursor
.getString(actual_image_column_index);
file = new File(img_path);
} else {
file = new File(uri.getPath());
}
if (actualImageCursor != null) actualImageCursor.close();
return file;
}
/** * 获取AndroidManifest.xml里 <meta-data>的值 * * @param context * @param name * @return */
public static String getMetaData(Context context, String name) {
String value = null;
try {
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
value = appInfo.metaData.getString(name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}
}