我需要为Android应用程序使用唯一的ID,我认为该设备的序列号将是一个很好的候选人.如何在我的应用中检索Android设备的序列号?
我正在开发一个针对Android 4.0(API 14)及更高版本的Android应用程序.
我正在寻找一个每个设备唯一的序列号,并且这个序列号永远存在(与设备一起死亡,在出厂重置后不会改变).
我在网上发现了很多关于Android设备的唯一标识符的结果,但在android.os.Build.SERIAL数字上却很少.
到目前为止,我已经消除了ANDROID_ID的使用,因为它可能会在出厂重置后发生变化.我也消除了IMEI的使用,因为Android设备可能是非手机的.我无法使用wifi或蓝牙MAC ADDRESS,因为如果未启用硬件(基于我在网络上找到的内容),设备可能没有这样的硬件和/或这样的mac地址可能无法读取.
我相信我可能会去Android设备序列号.
可以使用android.os.Build.SERIAL轻松访问它(因为它是在API级别9中添加的,不需要任何其他权限).
我的问题是:
考虑到我的应用程序针对Android 4.0(API 14)及更高版本,是每个设备唯一的android设备的android.os.Build.SERIAL号码吗?
目前,android.os.Build.SERIAL的文档指示:硬件序列号(如果可用).仅限字母数字,不区分大小写. 这是否意味着序列号可能不可用?
什么是满足上述条件的另一种替代方案?
如何以编程方式访问下图中显示的值?
我想知道序列号生成器和验证器如何工作.我的目标是生成一个序列号,其中包含五个部分,仅包括数字和字母.
我喜欢编码作为一种爱好,不会称自己为专业程序员.但是,我对这些有趣的功能如何在技术上工作以扩展我的想法非常感兴趣.
任何提示,经验或书面算法都表示赞赏.
我怎样才能得到serial number
一个的hard disk
使用驱动器Python
上Linux
?
NFC标签是否真的相互独特,至少在他们的序列号中是这样?我们可以依赖这样一个事实:没有2个NFC标签可以拥有相同的序列号吗?我对此持高度怀疑态度,因为那里有(并且会有更多)NFC标签,我认为没有人控制连续剧......
我问的原因是我正在开发一个使用NFC标签的基于密钥的系统.我不需要写标签,我基本上只需要他们的序列号.但我需要它们才能真正独一无二.
此外,我想知道是否可以克隆序列号(我知道标签的内容总是可以读取和克隆,但是可以编程另一个标签以具有完全相同的ID /序列吗?)
在某些版本的Android和Linux的其他版本中,可以获取已安装SD卡的序列号,例如通过读取/sys/class/mmc_host/mmc0/mmc0:0001/serial
或的内容/sys/block/mmcblk0/device/serial
(特定数字可能会有所不同).在我的测试中,只要将SD卡插入内置SD卡插槽(不通过USB适配器安装),这就非常可靠.
但是从Android 7.0 Nougat开始,据说操作系统阻止访问这些信息,至少在某些设备上是这样.我通过在新的阿尔卡特A30 GSM(Android 7.0)上运行测试应用程序对此进行了测试,实际上上述方法失败并出现权限错误:
java.io.FileNotFoundException: /sys/block/mmcblk0/device/serial (Permission denied)
at java.io.FileInputStream.open(Native Method)
Run Code Online (Sandbox Code Playgroud)
为了将来参考,我们(从adb shell测试)具有ls -ld
以下权限:
/sys/class/mmc_host
但不是 /sys/class/mmc_host/mmc0
/sys/block
但不是 /sys/block/mmcblk0
由于上述方法不再有效,
有没有其他方法可以获得Android 7.0或更高版本中安装的SD卡的序列号?
如果不这样做,谷歌是否有关于提供或不提供此功能的计划的任何文件或其他声明?我没有在Android 问题跟踪器中找到任何内容,但也许我没有找到正确的搜索引擎.
为了确保问题清楚,我正在谈论在非根设备上运行的普通(非系统)应用程序可以做什么,以及应用程序通常可以请求和接收的任何权限.
仅供参考,该/sbin
目录似乎不可读,因此命令/sbin/udevadm
不是一个选项.
证书序列号是X509证书的唯一密钥吗?用户选择证书,程序将序列号存储在首选项中.以下代码是否会返回所选证书?
public static X509Certificate2 GetCertificateBySerialNumber(string serialNumber)
{
X509Certificate2 selectedCertificate = null;
X509Store store = null;
try
{
// get certificate from the store "My", "CurrentUser"
store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection allCertificates = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection foundCertificates = (X509Certificate2Collection)allCertificates.Find(X509FindType.FindBySerialNumber, serialNumber, false);
// select the first certificate in collection
foreach (X509Certificate2 certificate in foundCertificates)
{
selectedCertificate = certificate;
break;
}
}
finally
{
if (store != null)
{
store.Close();
}
}
return selectedCertificate;
}
Run Code Online (Sandbox Code Playgroud)
更新:我最终使用证书指纹,如jglouie所建议的那样.
我需要获取安装了我的应用程序的Android设备的硬件序列代码.您可以看到此硬件序列号Settings > About Device > Status > Serial number
.
我虽然可以使用它Settings.Secure.ANDROID_ID or android.os.Build.SERIAL
,但它们都没有用,这意味着它们没有给我我想要的唯一标识符.例如android.os.Build.SERIAL
,当您运行命令adb devices时,获取ADB上显示的唯一ID .
请注意,这个问题的目标不是找到可以帮助我的另一个唯一标识符,而只是获取设备硬件序列号.
谢谢您的帮助.
编辑:
请注意,我不是在寻找字符串android.os.BUILD.SERIAL提供的值.我知道如何获得这个价值,但我对此并不感兴趣.
我有三星设备,因此,他们使用的序列号与android.os.BUILD.SERIAL提供的序列号不同.
serial-number ×10
android ×5
algorithm ×1
c# ×1
clone ×1
fcntl ×1
generator ×1
hard-drive ×1
license-key ×1
linux ×1
nfc ×1
python ×1
rfid ×1
sd-card ×1
settings ×1
validation ×1
x86 ×1