Androidで携帯電話IMEI,IMSI,MAC(Android 6.0)を取得するツール類(ユーザを識別する唯一のもの)

6582 ワード

LZ-Says:皆さんに1つのウェブサイトを推薦して、興味があれば調べることができて、みんなのために少し自分の力を貢献したいなら投稿することができて、ボスは審査して発表することができて、もっと良い助けが必要な人はみんなが積極的に投稿する住所を歓迎します:http://www.123si.org/android
最近のプロジェクトでは、携帯電話のIMEI、IMSI、MACを取得するために使用されています.
では、これらのものはいつ使われますか?
LZ個人は、プロジェクトで現在使用されているユーザ機器を一意に識別する必要がある場合(これがあなたが使用していることを証明する)に使用できると考えています.もちろんこれもLZ個人の少しの理解で、みんなが顔を打つことを歓迎します~
ではまず、この3つがそれぞれ何者なのかを簡単に普及させてみましょう..
1. IMEI
IMEI(International Mobile Equipment Identity)は、国際移動機器のアイデンティティコードの略で、国際移動装備識別コードは、15桁の数字からなる「電子シリアル番号」で、各携帯電話機に対応し、世界で唯一のコードである.各携帯電話機は、組み立てが完了すると、製造から納品まで製造されたメーカーに記録される世界で唯一の番号のセットが与えられます.PS:通俗的に言えば、あなたの現在の設備(携帯電話)を識別するのは世界で唯一で、個人の身分証明書に似ています.これは間違いなく唯一です.
2. IMSI
国際移動ユーザ識別コード(IMSI:International Mobile Subscriber Identification Number)は、移動ユーザを区別するためのフラグであり、SIMカードに格納され、移動ユーザを区別するための有効な情報として利用される.その総長さは15ビットを超えず、同様に0~9の数字を用いる.このうちMCCはモバイルユーザーが所属する国の番号で、3桁の数字を占めており、中国のMCCは460と規定されている.MNCはモバイルネットワーク番号で、2桁または3桁の数字から構成され、中国移動のモバイルネットワーク符号化(MNC)は00である.移動ユーザが属する移動通信網を識別するために使用される.MSINはモバイルユーザー識別コードで、あるモバイル通信網の中のモバイルユーザーPSを識別するために使用されます:通俗的にはあなたの現在のSIMカード(携帯電話カード)を識別する唯一で、同じく個人の身分証明書に似ていて、間違いなく唯一です~
3. MAC
MAC(Media Access ControlまたはMedium Access Control)アドレスは、メディアアクセス制御、または物理アドレス、ハードウェアアドレスと呼ばれ、ネットワークデバイスの位置を定義するために使用される.OSIモデルでは,3層目のネットワーク層がIPアドレスを担当し,2層目のデータリンク層がMACアドレスを担当する.そのため、ホストにはMACアドレスがありますが、各ネットワークの位置にはIPアドレスPSがあります.一般的には、あなたが今私のソフトウェア(機能)を使用しているときのアドレスを識別し、悪いことをしているときに警察のおじさんがあなたを捕まえるのに便利です.最も主要なのは、タブレットデバイスでは、imeiでデバイスを表示することができません.macアドレスをユーザーの一意のIDとして使用します
はい、次はこの3つを取得するコードを貼ります.の

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;

/**
 *          
 * 
 * @author HLQ
 * @createtime 2016-12-7  2:06:03
 * @remarks
 */
public class MobileInfoUtil {

    /**
     *     IMEI
     * 
     * @param context
     * @return
     */
    public static final String getIMEI(Context context) {
        try {
            //   TelephonyManager  
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            //  IMEI 
            String imei = telephonyManager.getDeviceId();
            //      ,              
            if (imei == null) {
                imei = "";
            }
            return imei;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }

    }

    /**
     *     IMSI
     */
    public static String getIMSI(Context context){
        try {
            TelephonyManager telephonyManager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
            //  IMSI 
            String imsi=telephonyManager.getSubscriberId();
            if(null==imsi){
                imsi="";
            }
            return imsi;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    
}


2017年6月10日00:26:48削除する前にMACアドレスを取得する方法を再更新します.
ああ、时にはこの仕事は本当に心が疲れて、自分の方向に沿って前進することができません
今日、突然リンクを送って、Android 6.0がMACアドレスを取得したと言って、戻ってきたのは02:00:00:00:00:00です.
いきなり丸隠しして、前に提出したデータを振り返ってみると、日了狗、本当に!!!
調査の結果、以下の結論を発見し、理解しました.
Android 6.0以降、androidはWiFiとBluetooth APIを介してアプリケーションでプログラム可能なローカルハードウェアへのアクセス識別子を削除した.WifiInfo.getMacAddress()メソッドとBluetoothAdapter.getAddress()メソッドは、02:00:00:00:00を返します.
So,現在,MACアドレスの取得方法も更新されているが,以下のようになっている.
    /**
     *   Android 6.0      MAC  
     *     、    ,           
     *     : android 6.0  ,android       WiFi     API                     。   WifiInfo.getMacAddress()   BluetoothAdapter.getAddress()        02:00:00:00:00:00
     * add by heliquan at 2017 6 12 
     *
     * @return
     */
    public static String getMobileMAC(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //             6.0        
            return getHeightMac();
        } else {
            return getLowerMac(context);
        }
    }

    /**
     *   Android 6.0      MAC   Android API < 23
     *
     * @return
     */
    private static String getLowerMac(Context context) {
        try {
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            //   MAC  
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String mac = wifiInfo.getMacAddress();
            if (null == mac) {
                //     
                mac = "";
            }
            return mac;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     *         MAC   Android API >= 23
     *
     * @return
     */
    private static String getHeightMac() {
        String str = "";
        String macSerial = "";
        try {
            Process pp = Runtime.getRuntime().exec(
                    "cat /sys/class/net/wlan0/address ");
            InputStreamReader ir = new InputStreamReader(pp.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);
            for (; null != str; ) {
                str = input.readLine();
                if (str != null) {
                    macSerial = str.trim();//    
                    break;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        if (macSerial == null || "".equals(macSerial)) {
            try {
                return loadFileAsString("/sys/class/net/eth0/address")
                        .toUpperCase().substring(0, 17);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return macSerial;
    }

    private static String loadFileAsString(String fileName) throws Exception {
        FileReader reader = new FileReader(fileName);
        String text = loadReaderAsString(reader);
        reader.close();
        return text;
    }

    private static String loadReaderAsString(Reader reader) throws Exception {
        StringBuilder builder = new StringBuilder();
        char[] buffer = new char[4096];
        int readLength = reader.read(buffer);
        while (readLength >= 0) {
            builder.append(buffer, 0, readLength);
            readLength = reader.read(buffer);
        }
        return builder.toString();
    }

結果は以下の通りで、テスト設備が少ないので、ご了承ください.
Android 6.0で取得:「mac」:「ac:c 1:ee:8 d:78:03」
Android 5.0で取得:「mac」:「38:bc:1 a:d 6:e 6:1 a」
Androidがますます良くなることを期待します~