Android设备网络、屏幕尺寸、SD卡、本地IP、存储空间、服务、进程、应用包名等信息获取的整合工具类。
1 package com.qiyu.ddb.util; 2 3 import android.annotation.SuppressLint; 4 import android.annotation.TargetApi; 5 import android.app.Activity; 6 import android.app.ActivityManager; 7 import android.content.ClipData; 8 import android.content.ClipboardManager; 9 import android.content.ComponentName; 10 import android.content.Context; 11 import android.content.Intent; 12 import android.content.pm.PackageInfo; 13 import android.content.pm.PackageManager; 14 import android.content.pm.ResolveInfo; 15 import android.content.res.Resources; 16 import android.database.Cursor; 17 import android.net.ConnectivityManager; 18 import android.net.NetworkInfo; 19 import android.net.Uri; 20 import android.os.Environment; 21 import android.os.StatFs; 22 import android.os.Vibrator; 23 import android.provider.MediaStore; 24 import android.telephony.TelephonyManager; 25 import android.text.TextUtils; 26 import android.util.DisplayMetrics; 27 import android.view.View; 28 import android.view.ViewTreeObserver; 29 import android.view.Window; 30 import android.view.inputmethod.InputMethodManager; 31 32 import java.io.File; 33 import java.net.InetAddress; 34 import java.net.NetworkInterface; 35 import java.net.SocketException; 36 import java.util.ArrayList; 37 import java.util.Enumeration; 38 import java.util.List; 39 import java.util.Map; 40 41 42 /** 43 * Desction:设备相关工具类 44 * Author:pengjianbo 45 * Date:17/4/30 上午5:09 46 */ 47 public class DeviceUtils 48 { 49 50 /** 51 * Unknown network class 52 */ 53 public static final int NETWORK_CLASS_UNKNOWN = 0; 54 55 /** 56 * wifi net work 57 */ 58 public static final int NETWORK_WIFI = 1; 59 60 /** 61 * "2G" networks 62 */ 63 public static final int NETWORK_CLASS_2_G = 2; 64 65 /** 66 * "3G" networks 67 */ 68 public static final int NETWORK_CLASS_3_G = 3; 69 70 /** 71 * "4G" networks 72 */ 73 public static final int NETWORK_CLASS_4_G = 4; 74 75 /** 76 * 判断SDCard是否可用 77 */ 78 public static boolean existSDCard() 79 { 80 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 81 { 82 return true; 83 } 84 else 85 { 86 return false; 87 } 88 } 89 90 /** 91 * 获取本机IP地址 92 * 93 * @return 94 */ 95 public static String getLocalIPAddress() 96 { 97 98 try 99 {100 for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )101 {102 NetworkInterface intf = en.nextElement();103 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )104 {105 InetAddress inetAddress = enumIpAddr.nextElement();106 if (!inetAddress.isLoopbackAddress())107 {108 return inetAddress.getHostAddress().toString();109 }110 }111 }112 }113 catch (SocketException ex)114 {115 return "0.0.0.0";116 }117 return "0.0.0.0";118 }119 120 /**121 * 多个SD卡时 取外置SD卡122 *123 * @return124 */125 public static String getExternalStorageDirectory()126 {127 // 参考文章128 // http://blog.csdn.net/bbmiku/article/details/7937745129 Map<String, String> map = System.getenv();130 String[] values = new String[map.values().size()];131 map.values().toArray(values);132 String path = values[values.length - 1];133 if (path.startsWith("/mnt/") && !Environment.getExternalStorageDirectory().getAbsolutePath().equals(path))134 {135 return path;136 }137 else138 {139 return null;140 }141 }142 143 /**144 * 获取可用空间大小145 *146 * @return147 */148 public static long getAvailaleSize()149 {150 if (!existSDCard())151 {152 return 0l;153 }154 File path = Environment.getExternalStorageDirectory(); //取得sdcard文件路径155 StatFs stat = new StatFs(path.getPath());156 long blockSize = stat.getBlockSize();157 long availableBlocks = stat.getAvailableBlocks();158 return availableBlocks * blockSize;159 }160 161 /**162 * 获取SD大小163 *164 * @return165 */166 public static long getAllSize()167 {168 if (!existSDCard())169 {170 return 0l;171 }172 File path = Environment.getExternalStorageDirectory();173 StatFs stat = new StatFs(path.getPath());174 long blockSize = stat.getBlockSize();175 long availableBlocks = stat.getBlockCount();176 return availableBlocks * blockSize;177 }178 179 public static boolean isOnline(Context context)180 {181 try182 {183 ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);184 NetworkInfo ni = cm.getActiveNetworkInfo();185 return ni != null ? ni.isConnectedOrConnecting() : false;186 }187 catch (Exception e)188 {189 e.printStackTrace();190 return false;191 }192 }193 194 /**195 * 服务是否运行196 *197 * @param mContext198 * @param className199 * @return200 */201 public static boolean isServiceRunning(Context mContext, String className)202 {203 boolean isRunning = false;204 ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);205 List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);206 if (serviceList.size() == 0)207 {208 return false;209 }210 for (int i = 0; i < serviceList.size(); i++)211 {212 if (serviceList.get(i).service.getClassName().equals(className) == true)213 {214 isRunning = true;215 break;216 }217 }218 return isRunning;219 }220 221 /**222 * 进程是否运行223 */224 public static boolean isProessRunning(Context context, String proessName)225 {226 boolean isRunning = false;227 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);228 229 List<ActivityManager.RunningAppProcessInfo> lists = am.getRunningAppProcesses();230 for (ActivityManager.RunningAppProcessInfo info : lists)231 {232 if (info.processName.equals(proessName))233 {234 isRunning = true;235 return isRunning;236 }237 }238 239 return isRunning;240 }241 242 /**243 * 震动244 *245 * @param context246 * @param duration247 */248 public static void vibrate(Context context, long duration)249 {250 Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);251 long[] pattern = {0, duration};252 vibrator.vibrate(pattern, -1);253 }254 255 /**256 * 获取最后一次拍照的图片257 *258 * @param context259 * @return260 */261 public static String getLatestCameraPicture(Context context)262 {263 264 if (!existSDCard())265 {266 return null;267 }268 269 String[] projection = new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns270 .BUCKET_DISPLAY_NAME, MediaStore.Images.ImageColumns.DATE_TAKEN, MediaStore.Images.ImageColumns.MIME_TYPE};271 Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images272 .ImageColumns.DATE_TAKEN + " DESC");273 if (cursor.moveToFirst())274 {275 String path = cursor.getString(1);276 return path;277 }278 return null;279 }280 281 /**282 * 获取手机大小(分辨率)283 *284 * @param activity285 * @return286 */287 public static DisplayMetrics getScreenPix(Activity activity)288 {289 // DisplayMetrics 一个描述普通显示信息的结构,例如显示大小、密度、字体尺寸290 DisplayMetrics displaysMetrics = new DisplayMetrics();291 // 获取手机窗口的Display 来初始化DisplayMetrics 对象292 // getManager()获取显示定制窗口的管理器。293 // 获取默认显示Display对象294 // 通过Display 对象的数据来初始化一个DisplayMetrics 对象295 activity.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);296 return displaysMetrics;297 }298 299 /**300 * 复制到剪切板301 *302 * @param context303 * @param content304 */305 @TargetApi(11)306 public static void coptyToClipBoard(Context context, String content)307 {308 int currentapiVersion = android.os.Build.VERSION.SDK_INT;309 if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB)310 {311 ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);312 ClipData clip = ClipData.newPlainText("label", content);313 clipboard.setPrimaryClip(clip);314 }315 else316 {317 android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);318 clipboard.setText(content);319 }320 }321 322 /**323 * 获取非系统应用包名324 *325 * @param context326 * @return327 */328 public static List<String> getAppPackageNamelist(Context context)329 {330 List<String> packList = new ArrayList<>();331 PackageManager pm = context.getPackageManager();332 List<PackageInfo> packinfos = pm.getInstalledPackages(0);333 for (PackageInfo packinfo : packinfos)334 {335 String packname = packinfo.packageName;336 packList.add(packname);337 }338 339 return packList;340 }341 342 /**343 * 判断某个应用是否已经安装344 *345 * @param context 上下文346 * @param packageName 包名347 * @return 是否已经安装348 */349 public static boolean isAppInstall(Context context, String packageName)350 {351 // 获取packagemanager352 final PackageManager packageManager = context.getPackageManager();353 // 获取所有已安装程序的包信息354 List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);355 // 用于存储所有已安装程序的包名356 List<String> packageNames = new ArrayList<String>();357 // 从pinfo中将包名字逐一取出,压入pName list中358 if (packageInfos != null)359 {360 for (int i = 0; i < packageInfos.size(); i++)361 {362 String packName = packageInfos.get(i).packageName;363 packageNames.add(packName);364 }365 }366 // 判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE367 return packageNames.contains(packageName);368 }369 370 public static int dip2px(Context context, float dipValue)371 {372 final float scale = context.getResources().getDisplayMetrics().density;373 return (int) (dipValue * scale + 0.5f);374 }375 376 public static int px2dip(Context context, float pxValue)377 {378 final float scale = context.getResources().getDisplayMetrics().density;379 return (int) (pxValue / scale + 0.5f);380 }381 382 /**383 * 判断是否有软控制键(手机底部几个按钮)384 *385 * @param activity386 * @return387 */388 public boolean isSoftKeyAvail(Activity activity)389 {390 final boolean[] isSoftkey = {false};391 final View activityRootView = (activity).getWindow().getDecorView().findViewById(android.R.id.content);392 activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()393 {394 @Override395 public void onGlobalLayout()396 {397 int rootViewHeight = activityRootView.getRootView().getHeight();398 int viewHeight = activityRootView.getHeight();399 int heightDiff = rootViewHeight - viewHeight;400 if (heightDiff > 100)401 { // 99% of the time the height diff will be due to a keyboard.402 isSoftkey[0] = true;403 }404 }405 });406 return isSoftkey[0];407 }408 409 /**410 * 获取statusbar高度411 *412 * @param context413 * @return414 */415 public static int getStatusBarHeight(Context context)416 {417 int height = 0;418 int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");419 if (resourceId > 0)420 {421 height = context.getResources().getDimensionPixelSize(resourceId);422 }423 424 return height;425 }426 427 /**428 * 获取navigationbar高度429 *430 * @param context431 * @return432 */433 public static int getNavigationBarHeight(Context context)434 {435 int height = 0;436 Resources resources = context.getResources();437 int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");438 //获取NavigationBar的高度439 if (resourceId > 0)440 {441 height = resources.getDimensionPixelSize(resourceId);442 }443 return height;444 }445 446 /**447 * 获取状态栏高度+标题栏(ActionBar)高度448 * (注意,如果没有ActionBar,那么获取的高度将和上面的是一样的,只有状态栏的高度)449 *450 * @param activity451 * @return452 */453 public static int getTopBarHeight(Activity activity)454 {455 return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();456 }457 458 459 /**460 * @param @param context461 * @param @param packageName 包名462 * @return void 返回类型463 * @throws464 * @Title: startActivityForPackage465 * @Description: TODO(通过)466 */467 @SuppressLint("NewApi")468 public static boolean startActivityForPackage(Context context, String packageName)469 {470 PackageInfo pi = null;471 try472 {473 pi = context.getPackageManager().getPackageInfo(packageName, 0);474 }475 catch (PackageManager.NameNotFoundException e)476 {477 e.printStackTrace();478 return false;479 }480 481 Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);482 resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);483 resolveIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);484 // resolveIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);485 resolveIntent.setPackage(pi.packageName);486 487 List<ResolveInfo> apps = context.getPackageManager().queryIntentActivities(resolveIntent, 0);488 489 ResolveInfo ri = apps.iterator().next();490 if (ri != null)491 {492 String packageName1 = ri.activityInfo.packageName;493 String className = ri.activityInfo.name;494 495 Intent intent = new Intent(Intent.ACTION_MAIN);496 intent.addCategory(Intent.CATEGORY_LAUNCHER);497 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);498 499 ComponentName cn = new ComponentName(packageName1, className);500 501 intent.setComponent(cn);502 context.startActivity(intent);503 return true;504 }505 return false;506 }507 508 /**509 * 隐藏键盘510 * :强制隐藏511 *512 * @param context513 */514 public static void hideInputSoftFromWindowMethod(Context context, View view)515 {516 try517 {518 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);519 imm.hideSoftInputFromWindow(view.getWindowToken(), 0);520 }521 catch (Exception e)522 {523 e.printStackTrace();524 }525 }526 527 /**528 * 显示输入法529 *530 * @param context531 * @param view532 */533 public static void showInputSoftFromWindowMethod(Context context, View view)534 {535 try536 {537 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);538 imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);539 }540 catch (Exception e)541 {542 e.printStackTrace();543 }544 }545 546 /**547 * 判断输入负是否处于激活状态548 *549 * @param context550 * @return551 */552 public static boolean isActiveSoftInput(Context context)553 {554 InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);555 return imm.isActive();556 }557 558 /**559 * 主动回到Home,后台运行560 *561 * @param context562 */563 public static void goHome(Context context)564 {565 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN);566 mHomeIntent.addCategory(Intent.CATEGORY_HOME);567 mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);568 context.startActivity(mHomeIntent);569 }570 571 /**572 * 返回移动终端类型573 * PHONE_TYPE_NONE :0 手机制式未知574 * PHONE_TYPE_GSM :1 手机制式为GSM,移动和联通575 * PHONE_TYPE_CDMA :2 手机制式为CDMA,电信576 * PHONE_TYPE_SIP:3577 *578 * @param context579 * @return580 */581 public static int getPhoneType(Context context)582 {583 TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);584 return telephonyManager.getPhoneType();585 }586 587 /**588 * 判断手机连接的网络类型(wifi,2G,3G,4G)589 * 联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO590 *591 * @param context592 * @return593 */594 public static int getNetType(Context context)595 {596 int netWorkType = NETWORK_CLASS_UNKNOWN;597 598 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);599 NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();600 601 if (networkInfo != null && networkInfo.isConnected())602 {603 int type = networkInfo.getType();604 605 if (type == ConnectivityManager.TYPE_WIFI)606 {607 netWorkType = NETWORK_WIFI;608 }609 else if (type == ConnectivityManager.TYPE_MOBILE)610 {611 TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);612 switch (telephonyManager.getNetworkType())613 {614 case TelephonyManager.NETWORK_TYPE_GPRS:615 case TelephonyManager.NETWORK_TYPE_EDGE:616 case TelephonyManager.NETWORK_TYPE_CDMA:617 case TelephonyManager.NETWORK_TYPE_1xRTT:618 case TelephonyManager.NETWORK_TYPE_IDEN:619 return NETWORK_CLASS_2_G;620 case TelephonyManager.NETWORK_TYPE_UMTS:621 case TelephonyManager.NETWORK_TYPE_EVDO_0:622 case TelephonyManager.NETWORK_TYPE_EVDO_A:623 case TelephonyManager.NETWORK_TYPE_HSDPA:624 case TelephonyManager.NETWORK_TYPE_HSUPA:625 case TelephonyManager.NETWORK_TYPE_HSPA:626 case TelephonyManager.NETWORK_TYPE_EVDO_B:627 case TelephonyManager.NETWORK_TYPE_EHRPD:628 case TelephonyManager.NETWORK_TYPE_HSPAP:629 return NETWORK_CLASS_3_G;630 631 case TelephonyManager.NETWORK_TYPE_LTE:632 return NETWORK_CLASS_4_G;633 default:634 return NETWORK_CLASS_UNKNOWN;635 }636 }637 }638 639 return netWorkType;640 }641 642 /**643 * 跳转至拨号界面644 *645 * @param context646 * @param phoneNumber 电话号码电话号码647 */648 public static void callDial(Context context, String phoneNumber)649 {650 context.startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));651 }652 653 /**654 * 发送短信655 *656 * @param context657 * @param phoneNumber658 * @param content659 */660 public static void sendSms(Context context, String phoneNumber, String content)661 {662 Uri uri = Uri.parse("smsto:" + (TextUtils.isEmpty(phoneNumber) ? "" : phoneNumber));663 Intent intent = new Intent(Intent.ACTION_SENDTO, uri);664 intent.putExtra("sms_body", TextUtils.isEmpty(content) ? "" : content);665 context.startActivity(intent);666 }667 668 /**669 * 判断当前设备是否为手机670 *671 * @param context672 * @return673 */674 public static boolean isPhone(Context context)675 {676 TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);677 if (telephony.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE)678 {679 return false;680 }681 else682 {683 return true;684 }685 }686 }