Android获得设备状态信息、Mac地址、IP地址的方法

前言

在APP开发时,经常会遇到要获取手机状态信息的场景,像升级时获取版本号,像发生异常时要收集手机信息等等。有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。

1 通过build获取手机硬件信息

  • 运用反射获取Build信息,然后从build中得到对应字段的值。这种情况适用于获取所有的build信息。
  • 或者直接调用Build类直接拿里面的字段名,如:android.os.Build.MODEL; // 手机型号 。这是为了获取单独某个手机信息的方法,直接调用Build的字段即可拿到对应信息,简单快捷。
  • 别忘了加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

下面是Build类的字段所对应的信息

String BOARD    The name of the underlying board, like "goldfish".基板名
String BOOTLOADER The system bootloader version number.
String BRAND    The brand (e.g., carrier) the software is customized for, if any.品牌名
String CPU_ABI   The name of the instruction set (CPU type + ABI convention) of native code.
String CPU_ABI2  The name of the second instruction set (CPU type + ABI convention) of native code.
String DEVICE   The name of the industrial design.品牌型号名,如小米4对应cancro
String DISPLAY   A build ID string meant for displaying to the user
String FINGERPRINT A string that uniquely identifies this build.包含制造商,设备名,系统版本等诸多信息
String HARDWARE  The name of the hardware (from the kernel command line or /proc).
String HOST
String ID     Either a changelist number, or a label like "M4-rc20".
String MANUFACTURER  The manufacturer of the product/hardware.
String MODEL    The end-user-visible name for the end product.
String PRODUCT   The name of the overall product.
String RADIO    The radio firmware version number.
String SERIAL   A hardware serial number, if available.
String TAGS    Comma-separated tags describing the build, like "unsigned,debug".
long  TIME    当前时间,毫秒值
String TYPE    The type of build, like "user" or "eng".
String UNKNOWN   Value used for when a build property is unknown.
String USER
//运用反射得到build类里的字段
 Field[] fields = Build.class.getDeclaredFields();
    //遍历字段名数组
    for (Field field : fields) {
      try {
        //将字段都设为public可获取
        field.setAccessible(true);
        //filed.get(null)得到的即是设备信息
        haspmap.put(field.getName(), field.get(null).toString());
        Log.d("CrashHandler", field.getName() + " : " + field.get(null));
      } catch (Exception e) {
      }
    }

下面是小米4对应的设备信息

D/CrashHandler: BOARD : MSM8974
D/CrashHandler: BOOTLOADER : unknown
D/CrashHandler: BRAND : Xiaomi
D/CrashHandler: CPU_ABI : armeabi-v7a
D/CrashHandler: CPU_ABI2 : armeabi
D/CrashHandler: DEVICE : cancro
D/CrashHandler: DISPLAY : MMB29M
D/CrashHandler: FINGERPRINT : Xiaomi/cancro_wc_lte/cancro:6.0.1/MMB29M/V8.1.3.0.MXDCNDI:user/release-keys
D/CrashHandler: HARDWARE : qcom
D/CrashHandler: HOST : c3-miui-ota-bd43
D/CrashHandler: ID : MMB29M
D/CrashHandler: IS_DEBUGGABLE : false
D/CrashHandler: MANUFACTURER : Xiaomi
D/CrashHandler: MODEL : MI 4LTE
D/CrashHandler: PRODUCT : cancro_wc_lte
D/CrashHandler: RADIO : unknown
//设备的序列号码-SERIAL
D/CrashHandler: SERIAL : abcdefgh
D/CrashHandler: SUPPORTED_32_BIT_ABIS : [Ljava.lang.String;@76b6d2b
D/CrashHandler: SUPPORTED_64_BIT_ABIS : [Ljava.lang.String;@e42c588
D/CrashHandler: SUPPORTED_ABIS : [Ljava.lang.String;@9cdbb21
D/CrashHandler: TAG : Build
D/CrashHandler: TAGS : release-keys
D/CrashHandler: TIME : 1478606340000
D/CrashHandler: TYPE : user
D/CrashHandler: UNKNOWN : unknown
D/CrashHandler: USER : builder

2.通过getSystemService()来获取Ip地址

Context.getSystemService()这个方法是非常实用的方法,只须在参数里输入一个String 字符串常量就可得到对应的服务管理方法,可以用来获取绝大部分的系统信息,各个常量对应的含义如下。

WINDOW_SERVICE (“window”)
The top-level window manager in which you can place custom windows. The returned object is a WindowManager.

LAYOUT_INFLATER_SERVICE (“layout_inflater”)
A LayoutInflater for inflating layout resources in this context.

ACTIVITY_SERVICE (“activity”)
A ActivityManager for interacting with the global activity state of the system.

POWER_SERVICE (“power”)
A PowerManager for controlling power management.

ALARM_SERVICE (“alarm”)
A AlarmManager for receiving intents at the time of your choosing.
NOTIFICATION_SERVICE (“notification”)
A NotificationManager for informing the user of background events.

KEYGUARD_SERVICE (“keyguard”)
A KeyguardManager for controlling keyguard.

LOCATION_SERVICE (“location”)
A LocationManager for controlling location (e.g., GPS) updates.

SEARCH_SERVICE (“search”)
A SearchManager for handling search.

VIBRATOR_SERVICE (“vibrator”)
A Vibrator for interacting with the vibrator hardware.

CONNECTIVITY_SERVICE (“connection”)
A ConnectivityManager for handling management of network connections.

WIFI_SERVICE (“wifi”)
A WifiManager for management of Wi-Fi connectivity.

WIFI_P2P_SERVICE (“wifip2p”)
A WifiP2pManager for management of Wi-Fi Direct connectivity.

INPUT_METHOD_SERVICE (“input_method”)
An InputMethodManager for management of input methods.

UI_MODE_SERVICE (“uimode”)
An UiModeManager for controlling UI modes.

DOWNLOAD_SERVICE (“download”)
A DownloadManager for requesting HTTP downloads

BATTERY_SERVICE (“batterymanager”)
A BatteryManager for managing battery state

JOB_SCHEDULER_SERVICE (“taskmanager”)
A JobScheduler for managing scheduled tasks

NETWORK_STATS_SERVICE (“netstats”)
A NetworkStatsManager for querying network usage statistics.
Note: System services obtained via this API may be closely associated with the Context in which they are obtained from. In general, do not share the service objects between various different contexts (Activities, Applications, Services, Providers, etc.)

Parameters
name
The name of the desired service.

Returns
The service or null if the name does not exist.

要获取IP地址需要用到Context.CONNECTIVITY_SERVICE,这个常量所对应的网络连接的管理方法。

代码如下需要权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
/**获得IP地址,分为两种情况,一是wifi下,二是移动网络下,得到的ip地址是不一样的*/
  public static String getIPAddress() {
    Context context=MyApp.getContext();
    NetworkInfo info = ((ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
    if (info != null && info.isConnected()) {
      if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
        try {
          //Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
          for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
              InetAddress inetAddress = enumIpAddr.nextElement();
              if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                return inetAddress.getHostAddress();
              }
            }
          }
        } catch (SocketException e) {
          e.printStackTrace();
        }
      } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        //调用方法将int转换为地址字符串
        String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
        return ipAddress;
      }
    } else {
      //当前无网络连接,请在设置中打开网络
    }
    return null;
  }
  /**
   * 将得到的int类型的IP转换为String类型
   * @param ip
   * @return
   */
  public static String intIP2StringIP(int ip) {
    return (ip & 0xFF) + "." +
        ((ip >> 8) & 0xFF) + "." +
        ((ip >> 16) & 0xFF) + "." +
        (ip >> 24 & 0xFF);
  }

3.获得Mac地址

我们知道mac地址是网卡的唯一标识,通过这个可以判断网络当前连接的手机设备有几台。代码如下:

 public static String getMacAddress(){
 /*获取mac地址有一点需要注意的就是android 6.0版本后,以下注释方法不再适用,不管任何手机都会返回"02:00:00:00:00:00"这个默认的mac地址,这是googel官方为了加强权限管理而禁用了getSYstemService(Context.WIFI_SERVICE)方法来获得mac地址。*/
 //    String macAddress= "";
//    WifiManager wifiManager = (WifiManager) MyApp.getContext().getSystemService(Context.WIFI_SERVICE);
//    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//    macAddress = wifiInfo.getMacAddress();
//    return macAddress;
    String macAddress = null;
    StringBuffer buf = new StringBuffer();
    NetworkInterface networkInterface = null;
    try {
      networkInterface = NetworkInterface.getByName("eth1");
      if (networkInterface == null) {
        networkInterface = NetworkInterface.getByName("wlan0");
      }
      if (networkInterface == null) {
        return "02:00:00:00:00:02";
      }
      byte[] addr = networkInterface.getHardwareAddress();
      for (byte b : addr) {
        buf.append(String.format("%02X:", b));
      }
      if (buf.length() > 0) {
        buf.deleteCharAt(buf.length() - 1);
      }
      macAddress = buf.toString();
    } catch (SocketException e) {
      e.printStackTrace();
      return "02:00:00:00:00:02";
    }
    return macAddress;
  }

4.获取手机号码、IMEI码

 /**获取手机的IMEI号码*/
  public static String getPhoneIMEI() {
    TelephonyManager mTm = (TelephonyManager) MyApp.getContext().getSystemService(Context.TELEPHONY_SERVICE);
    String imei = mTm.getDeviceId();
    String imsi = mTm.getSubscriberId();
    String mtype = android.os.Build.MODEL; // 手机型号
    String numer = mTm.getLine1Number(); // 手机号码,有的可得,有的不可得
    return imei;
  }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Android添加音频的几种方法

    在res文件夹中新建一个文件夹,命名为raw.在里面放入我们需要的音频文件. 第一种: // 根据资源创建播放器对象 player = MediaPlayer.create(this, R.raw.xiaoxiaole); try { player.prepare();// 同步 } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOExcept

  • Android Java调用自己C++类库的实例讲解

    Android Java 如何调用自己的 C++ 的类库 下面以 Java 调用 C++ 的加法运算函数为例,做简单说明. (使用 Android Studio 3 编译) 首先编译 c++ 类库 创建独立目录存放 c++ 文件,例如 "app/src/main/cpp/add.cpp",内容如下 #include <jni.h> extern "C" JNIEXPORT jint JNICALL Java_com_example_liyi_demo_U

  • Android可自定义神奇动效的卡片切换视图实例

    前言 面对众多卡片层叠效果,我们的产品童鞋也突发奇想,搞出了另一种卡片层叠切换展示的交互,而且产品狗们居然要求多做几种动效给他们看,好让他们选择,这简直就是要搞事情啊,what are you 弄啥咧?! "哥哥我做不到啊.....啊.....呸",做为一名有节操的程序猿,自然是不能说出这么没有出息的话,哥就满足你们,于是,出了个可自定义动效的卡片切换视图,效果如下所示 思路 首先,要展示出卡片层叠的视觉效果.在这里,我们通过方块的缩放大小差异以及在Y方向上的位置差异,来展现这种视觉效

  • Android scrollview实现底部继续拖动查看图文详情

    本文实例为大家分享了Android实现底部拖动查看图文详情的具体代码,供大家参考,具体内容如下 一.效果图 二.实现步骤 1.xml布局的实现/p> <ScrollView android:id="@+id/mymyscrollview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@

  • Android实现淘宝倒计时功能

    本文实例为大家分享了Android实现淘宝倒计时的具体代码,供大家参考,具体内容如下 一.效果图(这里为了方便我就没弄gif图了,功能是能动的) 二.实现步骤 1.自定义倒计时控件. package com.cqxxny.myapplication; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Message

  • Android调试神器stetho使用详解和改造

    概述 stetho是Facebook开源的一个Android调试工具,项目地址:facebook/stetho 通过Stetho,开发者可以使用chrome的inspect功能,对Android应用进行调试和查看. 功能概述 stetho提供的功能主要有: Network Inspection:网络抓包,如果你使用的是当前流行的OkHttp或者Android自带的 HttpURLConnection,你可以轻松地在chrome inspect窗口的network一栏抓到所有的网络请求和回包,还用

  • Android线程中Handle的使用讲解

    Android UI线程是不安全的,子线程中进行UI操作,可能会导致程序的崩溃,解决办法:创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了 定义类继承Handler public class BallHandler extends Handler{ ImageView imageview; Bitmap bitmap; public BallHandle

  • Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static String tryGetWifiMac(Context context) { WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wi

  • Android传感器SensorEventListener之加速度传感器

    这个类(我的是Activity中)继承SensorEventListener接口 先获取传感器对象,再获取传感器对象的类型 //获取传感器管理对象 SensorManager mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); // 获取传感器的类型(TYPE_ACCELEROMETER:加速度传感器) Sensor mSensor = mSensorManager.getDefaultSensor(

  • Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 adb shell dumpsys activity top 2).我们的终端安装了pidcat.py脚本,然后执行如下的命令就可以打印当前运行app的全日志, pidcat.py packageName 3).思考,为什么每次都需要这样重复的操作呢?一说到重复,我们应该立马想到是否可以用脚本解决重复

随机推荐