zoukankan      html  css  js  c++  java
  • 获取设备信息——获取客户端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 + "
    ");  
                    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/

  • 相关阅读:
    Redis
    cut
    grep
    MySQL中EXPLAIN的解释
    MySQL数据类型
    有用的MySQL语句
    mysql函数
    memcache
    存储过程 游标的使用
    存储过程批量删除
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/7517492.html
Copyright © 2011-2022 走看看