Android 获取手机名称

时间:2024-02-19 08:08:59

1. 需求

在这里插入图片描述
获取框中的手机名称,注意这里与其他文章不一样的地方,这个手机名称可以修改,并且会作用于蓝牙以及热点等功能。

2. 问题分析

首先查阅了网上关于获取手机名称或者设备名称的解决方案,一般包括两种:

2.1 Build.MODEL

显然这个名称与目标完全不符,自行尝试

2.2 BluetoothAdapter.getName()

这个是一个解决方法,但是当关闭蓝牙后再修改手机名称的话,通过这个方式获取的是旧名称,修改后的名称获取不到

也就是说,网上给出的解决方法已经到了尽头,需要自己找个解决方案,那么我的分析思路:

  1. 先查看Build.MODEL源码,发现最后是通过SystemProperties.get(property, UNKNOWN)得到属性,传入的值是属性对应的键,比如MODEL对应ro.product.model,那么手机名称是否也是类似的键值属性呢;
  2. 搜索ro.product.model和SystemProperties相关的内容,我了解了它确实是可以获取系统属性的,我感觉手机名称也属于系统属性,因此继续搜索下去;
  3. 后来查到了通过命令adb shell getprop > prop.txt可以导出系统属性,那么我来看看结果是什么,果然,这个文件中包括了“小米手机”这个名称,然后修改名称再看一次,发现确实是对应的,那么我们就获得了key:persist.sys.device_name,同时找到ro.product.model对应的值,这样就确定可以通过SystemProperties得到结果;
  4. 又因为SystemProperties不能直接使用,那么寻找其他办法,显然可以通过反射使用get方法,那么就尝试一下,当然还有另一个方式就是通过代码执行cmdgetprop,这里就仅用反射吧。
[persist.sys.dalvik.vm.lib.2]: [libart.so]
[persist.sys.datastall.detect]: [0]
[persist.sys.device_name]: [小米手机]
[persist.sys.enable_inputopts]: [true]
[persist.sys.enable_ioprefetch]: [false]

3. 代码

通过反射将key传入,得到deviceName,最终任务完成,搞定

String deviceName = "";
try{
    Class<?> cls = Class.forName("android.os.SystemProperties");
    Object object = (Object) cls.newInstance();
    Method getName = cls.getDeclaredMethod("get", String.class);
    deviceName = (String) getName.invoke(object, "persist.sys.device_name");
} catch (Exception e){
    e.printStackTrace();
}