1. 需求
获取框中的手机名称,注意这里与其他文章不一样的地方,这个手机名称可以修改,并且会作用于蓝牙以及热点等功能。
2. 问题分析
首先查阅了网上关于获取手机名称或者设备名称的解决方案,一般包括两种:
2.1 Build.MODEL
显然这个名称与目标完全不符,自行尝试
2.2 BluetoothAdapter.getName()
这个是一个解决方法,但是当关闭蓝牙后再修改手机名称的话,通过这个方式获取的是旧名称,修改后的名称获取不到
也就是说,网上给出的解决方法已经到了尽头,需要自己找个解决方案,那么我的分析思路:
- 先查看Build.MODEL源码,发现最后是通过SystemProperties.get(property, UNKNOWN)得到属性,传入的值是属性对应的键,比如MODEL对应ro.product.model,那么手机名称是否也是类似的键值属性呢;
- 搜索ro.product.model和SystemProperties相关的内容,我了解了它确实是可以获取系统属性的,我感觉手机名称也属于系统属性,因此继续搜索下去;
- 后来查到了通过命令
adb shell getprop > prop.txt
可以导出系统属性,那么我来看看结果是什么,果然,这个文件中包括了“小米手机”这个名称,然后修改名称再看一次,发现确实是对应的,那么我们就获得了key:persist.sys.device_name
,同时找到ro.product.model
对应的值,这样就确定可以通过SystemProperties得到结果; - 又因为SystemProperties不能直接使用,那么寻找其他办法,显然可以通过反射使用get方法,那么就尝试一下,当然还有另一个方式就是通过代码执行cmd
getprop
,这里就仅用反射吧。
[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();
}