• 来自:...如果我们想唯一识别一台Android设备,就需要获取设备的唯一识别码。怎么获取呢? 下面是An

    来自:http://syawlaus.com/remindme-%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96android%E8%AE%BE%E5%A4%87%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81%EF%BC%9F/

    如果我们想唯一识别一台Android设备,就需要获取设备的唯一识别码。怎么获取呢?

    下面是Android设备一些可供选择的唯一识别码及其适用范围:

    IMEI (International Mobile Equipment Identity Number,国际移动设备识别码)

    • 用于在手机网络中识别每一部独立的手机
    • 对于不在手机网络的设备(如Android平板),就不能使用IMEI来识别。

    IMSI (International Mobile Subscriber Identity,国际移动用户识别码)

    • 它是在公众陆地移动电话网(PLMN)中用于唯一识别移动用户的一个号码,在GSM网络,这个号码通常被存放在SIM卡中
    • 跟IMEI一样,对于不在手机网络的设备就不能使用IMSI来识别。

    Android ID

    • 64位的十六进制字符串,设备首次启动时会随时生成
    • 如果设备恢复了出厂设置,这个值可能会改变
    • 设备root了之后,这个值可以手动修改
    • Android 2.2发现bug,部分设备具有相同Android ID(9774d56d682e549c),模拟器的Android ID也是这个
    • 这个值有时会为null
    • 一般不推荐使用

    Device ID

    • 唯一的设备ID,如GSM网络的IMEI,CDMA网络的MEID / ESN,可能返回null(API文档的描述)
    • 只对手机设备有效,对于不在手机网络的设备,会返回null
    • 获取到的Device ID值,即使设备恢复出厂设置也不会改变
    • 需要READ_PHONE_STATE权限
    • 某些设备的Device ID实现有bug,会返回0或*

    Serial Number

    WiFi MAC  Address

    • 不是所有Android设备都有WiFi
    • 对于有WiFi的设备,如果WiFi没有开启,可能获取不了WiFi MAC地址
    • 需要ACCESS_WIFI_STATE权限

    BlueTooth MAC Address

    • 如果没有开启BlueTooth,可能获取不了BlueTooth MAC地址
    • 需要BLUETOOTH权限

    UUID(Universally unique identifier,通用唯一标识符)

    展开全文
  • 如何获取一个能唯一标识每台Android设备的序号? 这个问题有很多答案,但是他们中的大部分只在某些情况下有效。 根据测试: 所有的设备都可以返回一个 TelephonyManager.getDeviceId() 所有的GSM设备 (测试设备...
    
    
    如何获取一个能唯一标识每台Android设备的序号?
    这个问题有很多答案,但是他们中的大部分只在某些情况下有效。
    根据测试:
    • 所有的设备都可以返回一个 TelephonyManager.getDeviceId()
    • 所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()
    • 所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值!
    • 所有添加有谷歌账户的设备可以返回一个 ANDROID_ID
    • 所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添加了谷歌账户)
    • 目前尚未测试的:没有SIM卡的GSM设备、没有添加谷歌账户的GSM设备、处于飞行模式的设备。
    所以如果你想得到设备的唯一序号, TelephonyManager.getDeviceId() 就足够了。但很明显暴露了DeviceID会使一些用户不满,所以最好把这些id加密了。实际上加密后的序号仍然可以唯一的识别该设备,并且不会明显的暴露用户的特定设备,例如,使用 String.hashCode() ,结合UUID:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

        final String tmDevice, tmSerial, tmPhone, androidId;
        tmDevice = "" + tm.getDeviceId();
        tmSerial = "" + tm.getSimSerialNumber();
        androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

        UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
        String uniqueId = deviceUuid.toString();
    展开全文
  • 2、所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber() 3、所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值! 4、所有添加有谷歌账户的设备可以返回一个...
    

    1、所有的设备都可以返回一个 TelephonyManager.getDeviceId()

    2、所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()

    3、所有的CDMA 设备对于 getSimSerialNumber() 却返回一个空值!

    4、所有添加有谷歌账户的设备可以返回一个 ANDROID_ID

    5、所有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId() 返回相同的值(只要在设置时添加了谷歌账户)


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


    final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
    final String tmDevice, tmSerial, tmPhone, androidId;
    tmDevice = "" + tm.getDeviceId();
    tmSerial = "" + tm.getSimSerialNumber();
    androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
     
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String uniqueId = deviceUuid.toString();
    展开全文
  • 这是刚刚实习用到设备识别码的时候带我的大哥给的,留下来以备不时之需。  import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.support.v4....

    这是刚刚实习用到设备识别码的时候带我的大哥给的,留下来以备不时之需。 

    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.support.v4.app.ActivityCompat;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    import java.util.UUID;
    
    
    /**
     * 获取手机信息工具类
     *
     * @author HLQ
     * @createtime 2016-12-7下午2:06:03
     * @remarks
     */
    public class MobileInfoUtil {
    
        /**
         * 获取手机IMEI
         *
         * @param context
         * @return
         */
        public static String getUUID(Context context) {
    
            final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    
            final String tmDevice, tmSerial, androidId;
    
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return "";
            }
            tmDevice = "" + tm.getDeviceId();
    
            androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);
    
            UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32));
    
            String uniqueId = deviceUuid.toString();
    
            Log.e("debug","uuid="+uniqueId);
    
            return uniqueId;
    
        }
    }

     

    展开全文
  • 最近看了下获取手机设备ID和手机信息以及SIM的信息例子,主要还是借鉴别人的,现在自己写一下,算是巩固加深了,也希望能给大家一个参考 必要的条件还是一部真机,SIM卡或者UIM卡。 首先,在AndroidMainfest....

    最近看了下获取手机设备ID和手机信息以及SIM的信息例子,主要还是借鉴别人的,现在自己写一下,算是巩固加深了,也希望能给大家一个参考

    必要的条件还是一部真机,SIM卡或者UIM卡。

    首先,在AndroidMainfest.xml里获取权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>。

    其次,新建一个工具类PhoneInfo.java,主要用来获取手机设备信息(附上源码):

     

    package com.wx.deviceid;
    
    import android.content.Context;
    import android.telephony.TelephonyManager;
    
    public class PhoneInfo {
        private TelephonyManager telephonemanager;
        private String IMSI;
        private Context ctx;
        /**
         * 获取手机国际识别码IMEI
         * */
        public  PhoneInfo(Context context){
            ctx=context;
            telephonemanager=(TelephonyManager)context
                    .getSystemService(Context.TELEPHONY_SERVICE);
        }
        
        /**
         * 获取手机号码 
         * */
        public String getNativePhoneNumber(){
           
           String nativephonenumber=null;
           nativephonenumber=telephonemanager.getLine1Number();
            
           return nativephonenumber;        
        }
        
        /**
         * 获取手机服务商信息
         *  
         * */
        public String  getProvidersName(){
            String providerName=null;
            try{
                IMSI=telephonemanager.getSubscriberId();
                //IMSI前面三位460是国家号码,其次的两位是运营商代号,00、02是中国移动,01是联通,03是电信。
                System.out.print("IMSI是:"+IMSI);
                if(IMSI.startsWith("46000")||IMSI.startsWith("46002")){
                    providerName="中国移动";
                }else if(IMSI.startsWith("46001")){
                    providerName="中国联通";
                }else if(IMSI.startsWith("46003")){
                    providerName="中国电信";
            }
                
            }catch(Exception e){
                e.printStackTrace();
            }
            return providerName;
     
    }
        /**
         * 获取手机信息
         * */
        public String getPhoneInfo(){
           
            TelephonyManager tm=(TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE);
            StringBuilder sb=new StringBuilder();
        
            sb.append("\nDeviceID(IMEI)"+tm.getDeviceId());
            sb.append("\nDeviceSoftwareVersion:"+tm.getDeviceSoftwareVersion());
            sb.append("\ngetLine1Number:"+tm.getLine1Number());
            sb.append("\nNetworkCountryIso:"+tm.getNetworkCountryIso());
            sb.append("\nNetworkOperator:"+tm.getNetworkOperator());
            sb.append("\nNetworkOperatorName:"+tm.getNetworkOperatorName());
            sb.append("\nNetworkType:"+tm.getNetworkType());
            sb.append("\nPhoneType:"+tm.getPhoneType());
            sb.append("\nSimCountryIso:"+tm.getSimCountryIso());
            sb.append("\nSimOperator:"+tm.getSimOperator());
            sb.append("\nSimOperatorName:"+tm.getSimOperatorName());
            sb.append("\nSimSerialNumber:"+tm.getSimSerialNumber());
            sb.append("\ngetSimState:"+tm.getSimState());
            sb.append("\nSubscriberId:"+tm.getSubscriberId());
            sb.append("\nVoiceMailNumber:"+tm.getVoiceMailNumber());
         
            return sb.toString();
                    
        }            
    }

    然后,再在启动的PhoneActivity中,添加调用代码:

    package com.wx.deviceid;
    /**
     *  获取手机设备测试信息
     * @author wangxiang
     *  2013-9-17
     * */
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    
    public class PhoneActivity extends Activity {
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_phone);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.phone, menu);
            PhoneInfo siminfo=new PhoneInfo(PhoneActivity.this);
            
            System.out.println("\ngetprovider:"+siminfo.getProvidersName());
            System.out.println("\ngeNativePhoneNumber:"+siminfo.getNativePhoneNumber());
            System.out.println("--------w---x---------");
            System.out.println("\ngetphoneinfo:"+siminfo.getPhoneInfo());
             return true;
        }
    
    }

    第四,完成以上两步就可以在真机上运行了,为了查看输出信息的方便,可以在logcat中,单独查看System.out的信息,

           方法是点击那个绿色的“+”,如图:

    然后在弹出框中的Filter name 和 By log tag里面均填入System.out。

    好了,现在可以运行项目了,查看一下logcat结果:

    09-17 17:42:49.924: I/System.out(2854): IMSI是:460023217433621
    09-17 17:42:49.925: I/System.out(2854): getprovider:中国移动
    09-17 17:42:49.931: I/System.out(2854): geNativePhoneNumber:
    09-17 17:42:49.932: I/System.out(2854): --------w---x---------
    09-17 17:42:49.970: I/System.out(2854): getphoneinfo:
    09-17 17:42:49.970: I/System.out(2854): DeviceID(IMEI)863581011235194
    09-17 17:42:49.970: I/System.out(2854): DeviceSoftwareVersion:78
    09-17 17:42:49.971: I/System.out(2854): getLine1Number:
    09-17 17:42:49.971: I/System.out(2854): NetworkCountryIso:cn
    09-17 17:42:49.972: I/System.out(2854): NetworkOperator:46000
    09-17 17:42:49.972: I/System.out(2854): NetworkOperatorName:中国移动
    09-17 17:42:49.972: I/System.out(2854): NetworkType:2
    09-17 17:42:49.972: I/System.out(2854): PhoneType:1
    09-17 17:42:49.972: I/System.out(2854): SimCountryIso:cn
    09-17 17:42:49.972: I/System.out(2854): SimOperator:46002
    09-17 17:42:49.972: I/System.out(2854): SimOperatorName:
    09-17 17:42:49.977: I/System.out(2854): SimSerialNumber:89860022091387006821
    09-17 17:42:49.978: I/System.out(2854): getSimState:5
    09-17 17:42:49.978: I/System.out(2854): SubscriberId:460023217433621
    09-17 17:42:49.979: I/System.out(2854): VoiceMailNumber:null

     

    其中geNativePhoneNumber的值为空,因为我的手机卡是动感地带的卡,所以无法获取,

    这一点可以参考我的上一篇随笔:Android手机号码不是所有的都能获取;

    另外我用联通的号码测试了一下,是可以获得号码的。

    最后再补充一下以上信息的具体含义:

    getNativePhoneNumber获取的手机号

    DeviceId(IMEI)手机 国际移动用户识别码

    NetworkOperator 移动运营商编号

    NetworkOperatorName 移动运营商名称

    SimSerialNumber  SimOperator  SimCountryIso  SimSerialNumber  SubscriberId(IMSI)   关于手机SIM卡的一些详细信息。

    展开全文
  • 虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、厂商定制系统中的Bug等限制,稳定性和唯一性并不理想。而通过其他硬件信息标识也因为系统版本、手机硬件等限制存在不同程度的问题。 下面收集了...
  • Android系统以及设备都有很多的“标识”号,比如常见的IMEI,SerizalNumber,UUID等概念,但是这些都存在一定程度上的不可靠性,到底如何标记一台Android设备? DEVICE_ID 假设我们确实需要用到真实设备的标识...
  • 因为需要在项目中需要获得一个稳定、可靠的设备唯一识别码,因此搜了一些网上的资料。今天我们将介绍几种方式。  1. DEVICE_ID  假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。在以前,我们的...
  • 在某些项目中,需要记录用户的某些设置,或行为,并上传到服务器,如果无需用户登录注册,就可记录独立这些内容,就需要用到设备的某些独立的序列。(以下部分android需要API8以以上,android2.3测试成功)  ...
  • 话不多说,先贴代码/**获取设备唯一标识
 * @param context 上下文
 * @return 设备唯一标识
 */
 public static String getUDID(Context context) {
 String udid = AppConfig.getUDID(context, null)...
  • Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好。 这个DEVICE_ID可以同通过下面的方法获取: TelephonyManager tm = ...
  • //如果获取不到imsi号,就拼接其它信息获取唯一: 结论是,依然有部分手机获取不到。 final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);  ...
  • 按照正常的获取Android 8.0 之前都是可以拿到我们的Imei的,就是广为流传的那些形式,我就意义赘述了,到了Android 9.0 之后就出现了部分手机厂商的机型获取不到我们的IMEI,例如 '‘一加’'等厂商,而且其他厂商的...
  • 这个问题来自于http://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id/2853253#2853253 ...Android设备有没有唯一的id?如果有的话,我怎么通过java代码获得这个id? ...
  • Android 获取设备唯一UUID的一种实现方式 import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.os....
  • 虽然Android系统中提供了这样设备识别码,但是由于Android系统版本、厂商定制系统中的Bug等限制,稳定性和唯一性并不理想。而通过其他硬件信息标识也因为系统版本、手机硬件等限制存在不同程度的问题。 2.下面...
  • http://www.cnblogs.com/lqminn/p/4204855.html1. DEVICE_ID假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。它根据不同的手机设备返回IMEI,MEID或者ESN,但它在使用的过程中会遇到很
  • 方法一:不需要权限(推荐)使用一些不需要权限的硬件设备码来生成Android设备的唯一识别码//获得独一无二的Psuedo ID public static String getUniquePsuedoID() { String serial = null; String m_szDevIDShort...
1 2 3 4 5 ... 20
收藏数 14,291
精华内容 5,716
关键字:

android获取设备识别码