獲取設備信息——獲取客戶端ip地址和mac地址


1、獲取本地IP(有可能是 內網IP,192.168.xxx.xxx)

 /**
     * 獲取本地IP
     * 
     * @return
     */
    public static String getLocalIpAddress() {
        try {
            Enumeration<networkinterface> en = NetworkInterface
                    .getNetworkInterfaces();
            while (en.hasMoreElements()) {
                NetworkInterface ni = en.nextElement();
                Enumeration<inetaddress> enIp = ni.getInetAddresses();
                while (enIp.hasMoreElements()) {
                    InetAddress inet = enIp.nextElement();
                    if (!inet.isLoopbackAddress()
                            && (inet instanceof Inet4Address)) {
                        return inet.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        return "0";
    }</inetaddress></networkinterface>

2.獲取網絡ip,比上述方法更加精確,但是要異步執行。

 

public class GetLocalHostIP implements Callable<String>{

    private GetLocalHostIP(){
        super();
    }
    public static String getIP(){
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> localIP = executorService.submit(new GetLocalHostIP());
        String ip = null;

        try {
            ip = localIP.get();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        catch (ExecutionException e){
            e.printStackTrace();
        }
        if(ip == null || ip.startsWith("192.168")){
            return "10.142.92.242";
        }else{
            return ip;
        }
    }

    @Override
    public String call() throws Exception {
        URL infoUrl = null;
        String ipLine = "";
        try {
            infoUrl = new URL("http://myip.dnsomatic.com");
            BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));
            ipLine =  in.readLine();
        } catch (Exception e) {
            try {
                infoUrl = new URL("http://icanhazip.com/");
                BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));
                ipLine =  in.readLine();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return ipLine;
    }
}

上述方法可以獲取ip,但是獲取速度較慢,對網速要求較高。(兩個網址都是國際通用,訪問較慢),下面介紹國內網站獲取ip地址的接口

/**  
     * 獲取IP地址  
     * @return  
     */  
    public static String GetNetIp() {  
        URL infoUrl = null;  
        InputStream inStream = null;  
        String line = "";  
        try {  
            infoUrl = new URL("http://pv.sohu.com/cityjson?ie=utf-8");  
            URLConnection connection = infoUrl.openConnection();  
            HttpURLConnection httpConnection = (HttpURLConnection) connection;  
            int responseCode = httpConnection.getResponseCode();  
            if (responseCode == HttpURLConnection.HTTP_OK) {  
                inStream = httpConnection.getInputStream();  
                BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));  
                StringBuilder strber = new StringBuilder();  
                while ((line = reader.readLine()) != null)  
                    strber.append(line + "\n");  
                inStream.close();  
                // 從反饋的結果中提取出IP地址  
                int start = strber.indexOf("{");  
                int end = strber.indexOf("}");  
                String json = strber.substring(start, end + 1);  
                if (json != null) {  
                    try {  
                        JSONObject jsonObject = new JSONObject(json);  
                        line = jsonObject.optString("cip");  
                    } catch (JSONException e) {  
                        e.printStackTrace();  
                    }  
                }  
                return line;  
            }  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return line;  
    }  
View Code

各大運營商都提供了ip地址查詢的接口:

新浪的IP地址查詢接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 

新浪多地域測試方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42 

搜狐IP地址查詢接口(默認GBK):http://pv.sohu.com/cityjson 

搜狐IP地址查詢接口(可設置編碼):http://pv.sohu.com/cityjson?ie=utf-8 

搜狐另外的IP地址查詢接口:http://txt.go.sohu.com/ip/soip 
太平洋電腦 IP庫接口:(默認callback=IPCallBack) http://whois.pconline.com.cn/ipJson.jsp 

http://whois.pconline.com.cn/?ip=[ip地址字符串] 
直接訪問:http://whois.pconline.com.cn/?ip= 
調用方法非常豐富,提供多種JS嵌入調用。 

網易有道IP地址API接口 

查詢IP地址: 
http://www.youdao.com/smartresult-xml/search.s?type=ip&q=115.156.238.114 


淘寶IP地址庫API接口 

1. 請求接口(GET): 
http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 

 

網上部分IP地址查詢接口需要收費,或者對每秒鍾請求次數有限制如:  http://iframe.ip138.com/ic.asp  

3.獲取mac地址

public static String getLocalMacAddress() {//沒有緩存的地址,則查詢
        String mac_s = "";
        try {
            byte[] mac;
            NetworkInterface ne = NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));
            mac = ne.getHardwareAddress();
            mac_s = byte2hex(mac);
        } catch (Exception e) {
        }
        mac_s;
        return mac_s;
    }

 4. 獲取設備唯一標識:

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,在項目中要使用以下代碼: 

缺點

•需要添加權限: 動態權限申請特別麻煩

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

•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使用,請參考下面的代碼示例。

缺點

序列號無法在所有Android設備上使用。

 

ANDROID_ID

說明

更具體地說,Settings.Secure.ANDROID_ID 是一串64位的編碼(十六進制的字符串),是隨機生成的設備的第一個引導,其記錄着一個固定值,通過它可以知道設備的壽命(在設備恢復出廠設置后,該值可能會改變)。 ANDROID_ID也可視為作為唯一設備標識號的一個好選擇。

 

缺點

• 對於Android 2.2(“Froyo”)之前的設備不是100%的可靠

• 此外,在主流制造商的暢銷手機中至少存在一個眾所周知的錯誤,每一個實例都具有相同的ANDROID_ID。

結論

對於絕大多數應用來說,只需識別特定的安裝配置,而不需要識別物理設備。所幸是,這樣做就省去了麻煩。

下面是部分使用設備ID的最佳途徑:

•支持各種設備類型的另一種方法是使用getDeviceID()API和ro.serialno的組合

•有許多值得參考的原因,來提醒開發者避免試圖識別特定的設備。對於那些想做一下這方面嘗試的用戶,最好的辦法可能是使用ANDROID_ID,並在一些傳統設備上做嘗試。

 推薦使用AndroidId 作為識別設備的唯一標識。

 

5、獲取屏幕寬高

 android獲取屏幕的高度和寬度用到WindowManager這個類,兩種方法:

 
1、WindowManager wm = (WindowManager) getContext()
                    .getSystemService(Context.WINDOW_SERVICE);
 
     int width = wm.getDefaultDisplay().getWidth();
     int height = wm.getDefaultDisplay().getHeight();
 
2、WindowManager wm = this.getWindowManager();
 
     int width = wm.getDefaultDisplay().getWidth();
     int height = wm.getDefaultDisplay().getHeight();

 

 

 

參考:http://blog.csdn.net/aminfo/article/details/7604451/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM