理论部分

1、每个设备都有一个唯一序列号,Android设备也不例外,PC上用Mac地址

实践部分

1、核心代码:

Secure.getString(getContentResolver(),Secure.ANDROID_ID);

2、一个小案例:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/tvId"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" />
</LinearLayout>

MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.widget.TextView;public class AndroididActivity extends Activity {TextView tvId = null;String androidId = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);tvId = (TextView)findViewById(R.id.tvId);tvId.setText(androidId);tvId.setTextSize(30.0f);}
}

1, 获取运营商sim卡imsi号,

   String IMSI =android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);

2,获取IME标识两种方法(手机唯一的标识)

String imei =((TelephonyManager) context.getSystemService(TELEPHONY_SERVICE)).getDeviceId();String IMEI =android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI)

不过纯APP开发SystemProperties,TelephonyProperties汇报错误,因为android.os.SystemProperties在SDK的库中是没有的,需要把Android SDK 目录下data下的layoutlib.jar文件加到当前工程的附加库路径中,就可以Import。

如果Android Pad没有IMEI,用此方法获取设备ANDROID_ID:

String android_id = Secure.getString(this.getContentResolver(),Secure.ANDROID_ID);

3,获取手机号

TelephonyManager tm=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);String number = tm.getLine1Number();

如下使用例子:

public static String getIMEI() {return ((TelephonyManager)AppXiKang.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();}public static String getAndroidId() {return android.provider.Settings.Secure.getString(AppXiKang.getApp().getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);}public static String getSimSerialNumber() {return ((TelephonyManager)AppXiKang.getApp().getSystemService(Context.TELEPHONY_SERVICE)).getSimSerialNumber();}public static String getSerialNumber1() {returnandroid.os.Build.SERIAL;}/*** getSerialNumber* @return result is same to getSerialNumber1()*/public static String getSerialNumber(){String serial = null;try {Class<?> c =Class.forName("android.os.SystemProperties");Method get =c.getMethod("get", String.class);serial = (String)get.invoke(c, "ro.serialno");} catch (Exception e) {e.printStackTrace();}return serial;}public static void displayDevice(){String dest_imei = getIMEI();String androidId =getAndroidId();Log.i(TAG, "isTestDevice:"+" IMEI:"+dest_imei+" ANDROID ID:" +androidId+" SerialNumber:"+ getSerialNumber()+" SimSerialNumber:" + getSimSerialNumber());}

运行结果示例:

IMEI:868331011992179

ANDROID ID:5a3b287f2b13bef8

SerialNumber:021YLJ212C001879

SimSerialNumber:898600810110

4. 获取一个能唯一标识每台Android设备的序号与服务器通信

所以如果你想得到设备的唯一序号, TelephonyManager.getDeviceId() 就足够了。但很明显暴露了DeviceID会使一些用户不满,所以最好把这些id加密了。实际上加密后的序号仍然可以唯一的识别该设备,并且不会明显的暴露用户的特定设备,例如,使用 String.hashCode() ,结合UUID:

String getuniqueId(){TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);Stringimei=tm.getDeviceId();StringsimSerialNumber=tm.getSimSerialNumber();String androidId =android.provider.Settings.Secure.getString(getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);UUID deviceUuid =newUUID(androidId.hashCode(), ((long)imei.hashCode() << 32) |simSerialNumber.hashCode());String uniqueIuniqueId d= deviceUuid.toString();returnuniqueId;}

最后的deviceID可能是这样的结果: 00000000-54b3-e7c7-0000-000046bffd97

得到设备独一无二的标识: 可以用于客户端与服务端通信的唯一标识

根据测试:

  • 所有的设备都可以返回一个TelephonyManager.getDeviceId()
  • 所有的GSM设备(测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()
  • 所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值!
  • 所有添加有谷歌账户的设备可以返回一个 ANDROID_ID
  • 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId()返回相同的值(只要在设置时添加了谷歌账户)
  • 目前尚未测试的:没有SIM卡的GSM设备、没有添加谷歌账户的GSM设备、处于飞行模式的设备。

在Android中,有以下几种方法获取这样的ID。

1. The IMEI: 仅仅只对Android手机有效:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
​​​​​​​String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE

采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是唯一的,它应该类似于 359881030314356(除非你有一个没有量产的手机(水货)它可能有无效的IMEI,如:0000000000000)。

2. Pseudo-Unique ID, 这个在任何Android手机中都有效

有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:

String m_szDevIDShort = "35" + //we make this look like a valid IMEI Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits  

大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。

3. The Android ID 

通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。

String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Returns: 9774d56d682e549c . 无需任何许可。

4. The WLAN MAC Address string

是另一个唯一ID。但是你需要为你的工程加入android.permission.ACCESS_WIFI_STATE 权限,否则这个地址会为null。

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
​​​​​​​String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();

Returns: 00:11:22:33:44:55 (这不是一个真实的地址。而且这个地址能轻易地被伪造。).WLan不必打开,就可读取些值。

5. The BT MAC Address string

只在有蓝牙的设备上运行。并且要加入android.permission.BLUETOOTH 权限.

BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter     m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
​​​​​​​String m_szBTMAC = m_BluetoothAdapter.getAddress();

Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也能读取。

Combined Device ID

综上所述,我们一共有五种方式取得设备的唯一标识。它们中的一些可能会返回null,或者由于硬件缺失、权限问题等获取失败。
但你总能获得至少一个能用。所以,最好的方法就是通过拼接,或者拼接后的计算出的MD5值来产生一个结果。

String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
// compute md5     MessageDigest m = null;
try {m = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i<p_md5Data.length;i++) {   int b =  (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)    if (b <= 0xF) m_szUniqueID+="0";
// add number to string    m_szUniqueID+=Integer.toHexString(b); }   // hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();

通过以上算法,可产生32位的16进制数据:
9DDDF85AFF0A87974CE4541BD94D5F55
现在你就可以对其进行你的应用了。

转载于:获得Android设备的唯一序列号 - 走看看

获得Android设备的唯一序列号相关推荐

  1. Android设备获取唯一识别码

    Android系统以及设备都有很多的"标识"号,比如常见的IMEI,SerizalNumber,UUID等概念,但是这些都存在一定程度上的不可靠性,到底如何标记一台Android设 ...

  2. Android之如何获取Android设备的唯一识别码笔记

    因为需要在项目中需要获得一个稳定.可靠的设备唯一识别码,因此搜了一些网上的资料.今天我们将介绍几种方式. 1. DEVICE_ID 假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID ...

  3. android 获取蓝牙设备id_不需要任何权限获得Android设备的唯一ID

    这个问题来自于Is there a unique Android device ID? 我对这个问题的答案做了整理,包括将另一篇文章加入进来作为补充,可以完美解决此问题. 作者提出的问题: Andro ...

  4. 获取Android设备的唯一识别码|设备号|序号|UUI

    如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效. 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDevi ...

  5. 获取android设备唯一编号_获取android设备的唯一ID

    在Android开发者官方blog上已经有一篇文章对此做了总结(参考链接1), 这里结合自已查询的资料再总结一下, 并给出最终符合要求的解决方案. 1. ANDROID_ID, Secure.ANDR ...

  6. Android 设备Id 唯一不重复,Redmi

    1.(唯一)不重复类: package com.xxx.xxx.util;import android.annotation.SuppressLint; import android.content. ...

  7. 获取Android设备的唯一识别码|设备号|序号|UUID

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50511283 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  8. 查看 android 设备号,获取Android设备的唯一识别码|设备号|序号|UUID

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50511283 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  9. 得到Android设备的唯一id

    权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses- ...

最新文章

  1. 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子
  2. win2003系统+IIS6下,经常出现w3wp.exe和sqlserver.exe的内存占用居高不下
  3. Entity Framework中IQueryable, IEnumerable, IList的区别(转自网络)
  4. 关于'java' 不是内部或外部命令,也不是可运行的程序 或批处理文件 和 错误: 找不到或无法加载主类 helloworld的问题...
  5. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例Reducer_案例_Debug调试---大数据之hadoop3.x工作笔记0132
  6. 修改windows默认远程管理端口
  7. Neotoma数据库学习第二天
  8. 最常用的Windows快捷键大全【高手都是如何玩电脑的】(不断更新中……)
  9. 工程测量学学习 详细
  10. 几个小图像处理工具网址
  11. leetcode59 spiral matrix2
  12. KDS加密软件的实际应用
  13. 关于SCI、EI、CCF、DASFAA
  14. html 出现脚本错误,当前页面脚本发生错误,教您当前页面脚本发生错误的解决方法...
  15. python3 socket TCP 服务器 一对多转发信息
  16. hazelcast_使用Hazelcast发布和订阅
  17. 计算机综合布线实验报告,综合布线设计实验报告.doc
  18. 7500字拆解林清轩:说透了的“数字化转型”还有什么秘密武器?
  19. 【数据应用案例学习】(一)—— 基于用户画像的腾讯大数据防刷架构
  20. 人民币符号输入的几种方法

热门文章

  1. c语言 自动计时万年历,C语言实现万年历
  2. win10开机右击文件夹卡死,转圈圈
  3. 对计算机专业大一新生的忠告
  4. pixy php,Pixyz Studio 2020.2.2.18 (x64)
  5. 超图发布SuperMap GIS 8C(2017) 进一步挖掘空间大数据价值
  6. v-html解析后台传来的html 含有script标签 将js当成字符串来编译咋办
  7. 京东数据采集工具:2022年8月洗衣机品牌销售数据
  8. 白嫖!10GB免流海外BackBlaze对象存储
  9. 更换新口号 ,发力雄安,李彦宏在百度AI的黎明回望初心
  10. 用OpenCV-Python制作灯光秀短视频