Android 获取唯一设备号和机型信息

 
Andriod 要联网、获得机型信息,需要得到授权。 
对于模拟器,就是配置AndroidManifest.xml 文件 加入 Xml代码 
<!-- 联网权限 -->  
<uses-permission  
    android:name="android.permission.INTERNET" />  
<!-- 获取机型信息权限 -->  
<uses-permission    
    android:name="android.permission.READ_PHONE_STATE" />  
<!-- 获取短信发送权限 -->  
<uses-permission  
    android:name="android.permission.SEND_SMS" />  
<!-- 联网权限 -->
<uses-permission
android:name="android.permission.INTERNET" />
<!-- 获取机型信息权限 -->
<uses-permission 
android:name="android.permission.READ_PHONE_STATE" />
<!-- 获取短信发送权限 -->
<uses-permission
android:name="android.permission.SEND_SMS" />

现在你就可以调用HttpUrlConnection进行Http请求了,试试以下代码,你可以获得机型信息。 

Java代码 
//...extends Activity     
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);   
        StringBuilder sb = new StringBuilder();   
  
        sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());   
        sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());   
        sb.append("\nLine1Number = " + 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("\nSimState = " + tm.getSimState());   
        sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());   
        sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());   
        Log.d("info", sb.toString());  
//...extends Activity  
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
StringBuilder sb = new StringBuilder();

sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());
sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());
sb.append("\nLine1Number = " + 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("\nSimState = " + tm.getSimState());
sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());
sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());
Log.d("info", sb.toString());


在Android中以上机型信息在手机状态Status里 
Settings->About Phone->Status 
各个栏目的功能介绍如下: 
Battery status:电池充电/未充电状态 
Battery level:电池剩余电量 
Phone number:手机序列号 
Network:所处的移动网络 
Signal strength:信号度 
Network type:网络制式 
Service state:所在服务区 
Roaming:漫游/未漫游 
Data access:共访问的数据大小 
IMEI:IMEI码 
IMEI SV:IMEI码的版本 
IMSI:国际移动用户识别码 
Wi-Fi  Mac address:G1无线Wi-Fi网络的Mac地址。 
Bluetooth address:蓝牙地址 
Up time:正常运行时间 
Awake Time:手机唤醒时间 





在计算机上,我们习惯用MAC地址来标志一台计算机。在Android设备上,可以用IMIE或者Android ID来标志一个设备。 

看一下Android上怎样获取这样的信息。 

一个是TelephonyManager的getDeviceId,另外一个是Settings.System的ANDROID_ID 

这里贴一段测试代码: 



Java代码 
package com.npc4.android.imie;   
import android.app.Activity;   
import android.content.Context;   
import android.os.Bundle;   
import android.telephony.TelephonyManager;   
import android.util.Log;   
import android.provider.Settings.System;   
/**  
* @author lixinso  
* 获取系统的唯一标识  
*/  
public class IMIE extends Activity {   
     @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
    
        getImieStatus();   
        getAndroidId();   
    
    }   
private void getImieStatus() {   
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);   
String deviceId = tm.getDeviceId();   
Log.e("DEVICE_ID ", deviceId + " ");   
}   
private void getAndroidId(){   
String androidId = System.getString(getContentResolver(), System.ANDROID_ID);   
Log.e("ANDROID_ID", androidId + " ");   
}   
}  
package com.npc4.android.imie;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.provider.Settings.System;
/**
* @author lixinso
* 获取系统的唯一标识
*/
public class IMIE extends Activity {
     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getImieStatus();
        getAndroidId();

    }
private void getImieStatus() {
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId();
Log.e("DEVICE_ID ", deviceId + " ");
}
private void getAndroidId(){
String androidId = System.getString(getContentResolver(), System.ANDROID_ID);
Log.e("ANDROID_ID", androidId + " ");
}
}

tm.getDeviceId()表示唯一的设备ID,例如对于GSM手机返回IMEI,对于CDMA手机返回MEID,如果设备不可用则返回NULL,比如在模拟器上。 

System.getString(getContentResolver(), System.ANDROID_ID)表示一个64位的数字,在设备第一次启动的时候随机生成并在设备的整个生命周期中不变。(如果重新进行出厂设置可能会改变) 




如何获取一个能唯一标识每台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 final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);  2    3     final String tmDevice, tmSerial, tmPhone, androidId;  4     tmDevice = "" + tm.getDeviceId();  5     tmSerial = "" + tm.getSimSerialNumber();  6     androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);  7    8     UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());  9     String uniqueId = deviceUuid.toString(); 最后的deviceID可能是这样的结果: 00000000-54b3-e7c7-0000-000046bffd97

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值