Android 获取手机名称

news/2024/11/16 21:58:50/

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();
}

4. 测试

MIUI可以,其他系统GG,其他系统类似华为、三星都失败了,从prop.txt文件来看,并没有将谁被名称存在系统配置文件中。那么问题来了,这个属性去哪了?

5. 再分析

如果从目标往前走已经是死路了,那么不妨从前往后走,我们从设置手机名称这个地方寻找它调用了什么方法,说不定就能发现一些东西。

显然,Android开源的优势体现出来,在查询了Google关于Android的源码后我发现,在关于手机这个界面,保存和获取手机名称都是在一个类叫做DeviceManager中实现的,具体相关的两部分代码为

package com.android.tv.settings.name;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.provider.Settings;
public class DeviceManager {/*** Retrieves the name from Settings.Global.DEVICE_NAME** @param context A context that can access Settings.Global* @return The device name.*/public static String getDeviceName(Context context) {return Settings.Global.getString(context.getContentResolver(), Settings.Global.DEVICE_NAME);}/*** Sets the system device name.** For now it will explicitly call the different discoverable services that haven't been ported* to use the Settings.Global.DEVICE_NAME entry.** @param context A context that can access Settings.Global* @param name The new device name.*/public static void setDeviceName(Context context, String name) {Settings.Global.putString(context.getContentResolver(), Settings.Global.DEVICE_NAME, name);BluetoothAdapter.getDefaultAdapter().setName(name);}
}

由上面的代码可知,原生Android在保存设备名称时会同时保存蓝牙的名称,而获取名称时是从Settings.Global中获取的,因此如果我们要在代码里得到设备名称,理论上应该也可以通过Settings.Global得到。

但是,根据我的测试,小米/三星/华为这三家都将Settings.Global设置为一个定值,也就是说,他们修改了这里的存储逻辑,在不知道系统源码的情况下我们应该是拿不到设别名称,除非通过蓝牙得到(但是蓝牙获取有Bug),而小米是个例外,他存储设备名称的位置被我碰巧找到了,所以这个需求还是没办法完美的实现,主要是各个Android厂商背锅。


http://www.ppmy.cn/news/720590.html

相关文章

名字、手机号、身份证中间 ****的用法

我这里用了两个办法 任君使用 data() {return {list: [{name: "吕小小",age: 20,fon: "17838470908",sfz: "450901192903102036",},{name: "吕大大",age: 20,fon: "17838470907",sfz: "470901192903102036",},],}…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(二)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

C++判断文件夹是否存在,不存在则创建(linux和windows)

Windows需要如下头文件&#xff1a; #include <direct.h> #include <io.h> Linux需要如下头文件&#xff1a; #include <sys/io.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <dirent.h> 具体…

2的N次方速查

2的1次方&#xff1a;2 2的2次方&#xff1a;4 2的3次方&#xff1a;8 2的4次方&#xff1a;16 2的5次方&#xff1a;32 2的6次方&#xff1a;64 2的7次方&#xff1a;128 2的8次方&#xff1a;256 2的9次方&#xff1a;512 2的10次方&#xff1a;1024 2的11次方&#xff1a;20…

java 2的64次幂_2的N次方对照表 2的64次方等于几?

2的1次方:2 2的2次方:4 2的3次方:8 2的4次方:16 2的5次方:32 2的6次方:64 2的7次方:128 2的8次方:256 2的9次方:512 2的10次方:1024 2的11次方:2048 2的12次方:4096 2的13次方:8192 2的14次方:16384 2的15次方:32768 2的16次方:65536 2的17次方:131072 2的18次…

工具 | 2的次方对照表

2的1次方&#xff1a;2 2的2次方&#xff1a;4 2的3次方&#xff1a;8 2的4次方&#xff1a;16 2的5次方&#xff1a;32 2的6次方&#xff1a;64 2的7次方&#xff1a;128 2的8次方&#xff1a;256 2的9次方&#xff1a;512 2的10次方&#xff1a;1024 2的11次方&#xff1a;20…

判断一个数是否为2的次方数

如果采用循环去遍历2的次方数&#xff0c;来判断时&#xff0c;当这个数特别大&#xff0c;时间复杂度为O&#xff08;n&#xff09;&#xff1b;所以采用别的方法&#xff0c;2的次方数其二进制表示最高位肯定为1&#xff0c;其余为0。 例如&#xff1a;8 二进制位 1000&#…

大数值:bigInteger---2^64次方

问&#xff1a; 如果基本的整数和浮点数精度不能够满足需求&#xff0c;可以使用java.math包中的两个类&#xff1a;BigInteger和BigDecimal BigInteger inBigInteger.valueOf(2); 或者 BigInteger innew BigInteger("2"); 将in变量的值设为2 然后再计算2^64 i…