A. 如何檢索Android設備的唯一ID
Android的開發者在一些特定情況下都需要知道手機中的唯一設備ID。例如,跟蹤應用程序的安裝,生成用於復制保護的DRM時需要使用設備的唯一ID。
范圍
本文提供有關如何讀取各種Android設備的 ID的介紹,用以使用標識號。本文假定用戶已經安裝了Android以及開發應用程序必要的工具。並且,本文假定用戶已了解Android的基本知識。
簡介在搭載Android操作系統的設備中,已經存在好幾種類型的設備標識號。先前的所有Android設備都具有電話功能,因此查找每部設備硬體唯一的IMEI,MEID,或ESN也很容易。但僅能使用Wifi的設備或音樂播放器沒有電話硬體,所以沒有這種類型的唯一標識號。本文闡述了如何讀取不同Android設備的標識號。檢索Android設備ID各種方式
以下是Android設備不同類型的識別設備ID。
· 唯一編號(IMEI,MEID,ESN,IMSI)
· MAC地址
· 序列號
· ANDROID_ID
唯一編號(IMEI,MEID,ESN,IMSI)
說明在以前,當Android設備均作為電話使用時,尋找唯一標識號比較簡單:()可用於找到(取決於網路技術)手機硬體唯一的IMEI,MEID,ESN和IMSI編號。
TelephonyManager.getDeviceId
IMEI,MEID,ESN,IMSI的定義如下:
•IMEI(國際移動設備識別碼)唯一編號,用於識別 GSM,WCDMA手機以及一些衛星電話(移動設備識別碼)全球唯一編號,用於識別CDMA移動電台設備的物理硬體,MEID出現的目的是取代ESN號段(電子序列號)(電子序列號)唯一編號,用於識別CDMA手機(國際移動用戶識別碼)與所有GSM和UMTS網路手機用戶相關聯的唯一識別編號如需要檢索設備的ID,在項目中要使用以下代碼:
•MEID
•ESN
•IMSI
import android.telephony.TelephonyManager;
import android.content.Context;
String imeistring = null;
String imsistring = null;
{
TelephonyManager telephonyManager;
telephonyManager =
( TelephonyManager )getSystemService( Context.TELEPHONY_SERVICE );
/*
* getDeviceId() function Returns the unique device ID.
* for example,the IMEI for GSM and the MEID or ESN for CDMA phones.
*/
imeistring = telephonyManager.getDeviceId();
/*
* getSubscriberId() function Returns the unique subscriber ID,
* for example, the IMSI for a GSM phone.
*/
imsistring = telephonyManager.getSubscriberId();
}
如要只讀取手機的狀態,則需添加READ_PHONE_STATE許可到AndroidManifest.xml文件中。
<uses-permission
android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
缺點
•Android設備要具有電話功能
•其工作不是很可靠
•序列號
•當其工作時,該值保留了設備的重置信息(「恢復出廠設置」),從而可以消除當客戶刪除自己設備上的信息,並把設備轉另一個人時發生的錯誤。
Mac地址
說明
可通過檢索找到設備的Wi - Fi或藍牙硬體的Mac地址。但是,不推薦使用Mac地址作為唯一的標識號。
缺點設備要具備Wi – Fi功能(並非所有的設備都有Wi – Fi功能)如果設備目前正在使用Wi - Fi,則不能報告Mac地址
序列號
從Android 2.3(「姜餅」)開始,通過android.os.Build.SERIAL方法序列號可被使用。沒有電話功能的設備也都需要上給出唯一的設備ID; 某些手機也可以需要這樣做。序列號可以用於識別MID(移動互聯網設備)或PMP(攜帶型媒體播放器),這兩種設備都沒有電話功能。通過讀取系統屬性值「ro.serialno」的方法,可以使用序列號作為設備ID 。如檢索序列號並作為設備ID使用,請參考下面的代碼示例。
import java.lang.reflect.Method;
String serialnum = null;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class );
serialnum = (String)( get.invoke(c, "ro.serialno", "unknown" ) );
}
catch (Exception ignored)
{
}
缺點
序列號無法在所有Android設備上使用。
ANDROID_ID
說明
更具體地說,Settings.Secure.ANDROID_ID 是一串64位的編碼(十六進制的字元串),是隨機生成的設備的第一個引導,其記錄著一個固定值,通過它可以知道設備的壽命(在設備恢復出廠設置後,該值可能會改變)。 ANDROID_ID也可視為作為唯一設備標識號的一個好選擇。如要檢索用於設備ID 的ANDROID_ID,請參閱下面的示例代碼
String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
缺點
• 對於Android 2.2(「Froyo」)之前的設備不是100%的可靠
• 此外,在主流製造商的暢銷手機中至少存在一個眾所周知的錯誤,每一個實例都具有相同的ANDROID_ID。
結論
對於絕大多數應用來說,只需識別特定的安裝配置,而不需要識別物理設備。所幸是,這樣做就省去了麻煩。
下面是部分使用設備ID的最佳途徑:
•支持各種設備類型的另一種方法是使用getDeviceID()API和ro.serialno的組合
•有許多值得參考的原因,來提醒開發者避免試圖識別特定的設備。對於那些想做一下這方面嘗試的用戶, 最好的辦法可能是使用ANDROID_ID,並在一些傳統設備上做嘗試。
轉載
B. 安卓軟體怎樣識別手機
在安卓系統文件夾裡面有一個「build.prop」文件,裡面就包括手機型號和其他參數等,一些軟體就是讀取這個文件就知道手機型號,
C. JAVA如何獲取區域網內所有安卓設備的ip地址,MAC以及序列號
1.得到區域網網段,可由自己機器的IP來確定 (也可以手動獲取主機IP-CMD-ipconfig /all)
2.根據IP類型,一次遍歷區域網內IP地址
JAVA類,編譯之後直接運行便可以得到區域網內所有IP,具體怎樣使用你自己編寫相應代碼調用便可
代碼如下::
package bean;
import java.io.*;
import java.util.*;
public class Ip{
static public HashMap ping; //ping 後的結果集
public HashMap getPing(){ //用來得到ping後的結果集
return ping;
}
//當前線程的數量, 防止過多線程摧毀電腦
static int threadCount = 0;
public Ip() {
ping = new HashMap();
}
public void Ping(String ip) throws Exception{
//最多30個線程
while(threadCount>30)
Thread.sleep(50);
threadCount +=1;
PingIp p = new PingIp(ip);
p.start();
}
public void PingAll() throws Exception{
//首先得到本機的IP,得到網段
InetAddress host = InetAddress.getLocalHost();
String hostAddress = host.getHostAddress();
int k=0;
k=hostAddress.lastIndexOf(".");
String ss = hostAddress.substring(0,k+1);
for(int i=1;i <=255;i++){ //對所有區域網Ip
String iip=ss+i;
Ping(iip);
}
//等著所有Ping結束
while(threadCount>0)
Thread.sleep(50);
}
public static void main(String[] args) throws Exception{
Ip ip= new Ip();
ip.PingAll();
java.util.Set entries = ping.entrySet();
Iterator iter=entries.iterator();
String k;
while(iter.hasNext()){
Map.Entry entry=(Map.Entry)iter.next();
String key=(String)entry.getKey();
String value=(String)entry.getValue();
if(value.equals("true"))
System.out.println(key+"-->"+value);
}
}
class PingIp extends Thread{
public String ip; // IP
public PingIp(String ip){
this.ip=ip;
}
public void run(){
try{
Process p= Runtime.getRuntime().exec ("ping "+ip+ " -w 300 -n 1");
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
//讀取結果行
for (int i=1 ; i <7; i++)
input.readLine();
String line= input.readLine();
if (line.length() <17 || line.substring(8,17).equals("timed out"))
ping.put(ip,"false");
else
ping.put(ip,"true");
//線程結束
threadCount -= 1;
}catch (IOException e){}
}
}
}