Android设备网络、屏幕尺寸、SD卡、本地IP、存储空间等信息获取工具类

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      * @return
124      */
125     public static String getExternalStorageDirectory()
126     {
127         // 参考文章
128         // http://blog.csdn.net/bbmiku/article/details/7937745
129         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         else
138         {
139             return null;
140         }
141     }
142 
143     /**
144      * 获取可用空间大小
145      *
146      * @return
147      */
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      * @return
165      */
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         try
182         {
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 mContext
198      * @param className
199      * @return
200      */
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 context
246      * @param duration
247      */
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 context
259      * @return
260      */
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.ImageColumns
270                 .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.Images
272                 .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 activity
285      * @return
286      */
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 context
303      * @param content
304      */
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         else
316         {
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 context
326      * @return
327      */
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         // 获取packagemanager
352         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,没有FALSE
367         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 activity
386      * @return
387      */
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             @Override
395             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 context
413      * @return
414      */
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 context
431      * @return
432      */
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 activity
451      * @return
452      */
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 context
461      * @param @param packageName   包名
462      * @return void    返回类型
463      * @throws
464      * @Title: startActivityForPackage
465      * @Description: TODO(通过)
466      */
467     @SuppressLint("NewApi")
468     public static boolean startActivityForPackage(Context context, String packageName)
469     {
470         PackageInfo pi = null;
471         try
472         {
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 context
513      */
514     public static void hideInputSoftFromWindowMethod(Context context, View view)
515     {
516         try
517         {
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 context
531      * @param view
532      */
533     public static void showInputSoftFromWindowMethod(Context context, View view)
534     {
535         try
536         {
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 context
550      * @return
551      */
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 context
562      */
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:3
577      *
578      * @param context
579      * @return
580      */
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为EVDO
590      *
591      * @param context
592      * @return
593      */
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 context
646      * @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 context
657      * @param phoneNumber
658      * @param content
659      */
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 context
672      * @return
673      */
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         else
682         {
683             return true;
684         }
685     }
686 }

 

posted @ 2017-04-30 05:10  火龙裸先生  阅读(691)  评论(0编辑  收藏  举报