AndroidはどのようにAndroidデバイスの唯一のIDを検索します

15004 ワード

このドキュメントについて
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ライセンスをAndroid Manifest.xmlファイルに追加する必要があります.

 
欠点
•Androidデバイスには電話機能が必要
•信頼性が低い
•シリアル番号
•この値は、動作時にデバイスのリセット情報(「工場出荷時の設定を復元」)を保持します.これにより、お客様が自分のデバイスの情報を削除し、デバイスを別の人に転送したときに発生するエラーを解消できます.
Macアドレス説明
デバイスのWi-FiまたはBluetoothハードウェアの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ビットの符号化(16進数の文字列)の列であり、ランダムに生成されたデバイスの最初のブートであり、デバイスの寿命が分かる固定値が記録されている(デバイスが出荷時の設定に戻ると、この値が変化する可能性がある).ANDROID_IDは、一意のデバイス識別番号としても選択可能です.デバイスID用のANDROID_IDを取得するには、次のサンプルコードを参照してください.
String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);

 
欠点
•Android 2.2(「Froyo」)以前のデバイスは100%信頼性が低い
•また、主流メーカーの売れ行きのよい携帯電話では、少なくとも1つのよく知られているエラーが存在し、各インスタンスは同じANDROID_IDを有する.
結論
ほとんどのアプリケーションでは、物理デバイスを識別する必要がなく、特定のインストール構成を識別するだけで、面倒を省くことができます.
以下は、デバイスIDの一部を使用するための最良の方法です.
•さまざまなデバイスタイプをサポートする別の方法は、getDeviceID()APIとro.serialnoの組み合わせを使用することです.
•開発者に特定のデバイスを識別しようとしないように注意する参考になる理由はたくさんあります.このような試みをしたいユーザーにとって、ANDROID_IDを使用して、いくつかの従来のデバイスで試してみるのが最善の方法かもしれません.
サンプルコード
次に、Android設定を追跡するためのコードの例を示します.
クラス:ReadDeviceID.java
package com.deviceid;
 
 
 
import java.lang.reflect.Method;
 
 
 
import android.app.Activity;
 
import android.content.Context;
 
import android.os.Bundle;
 
import android.provider.Settings;
 
import android.telephony.TelephonyManager;
 
import android.view.View;
 
import android.view.View.OnClickListener;
 
import android.widget.Button;
 
import android.widget.TextView;
 
 
 
public class ReadDeviceID extends Activity {
 
 
 
 Button bt;
 
 TextView idView;
 
 
 
    /** Called when the activity is first created. */
 
    @Override
 
    public void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.main);
 
 
 
        bt=(Button)findViewById(R.id.button1);
 
        idView=(TextView)findViewById(R.id.textView1);       

        bt.setOnClickListener(new OnClickListener() {   

 @Override
 
 public void onClick(View v) {
 
   String imeistring=null;    

              String imsistring=null;
 
   

 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();
 
 idView.append("IMEI No : "+imeistring+"
"); /* * getSubscriberId() function Returns the unique subscriber ID, * for example, the IMSI for a GSM phone. */ imsistring = telephonyManager.getSubscriberId(); idView.append("IMSI No : "+imsistring+"
"); /* * System Property ro.serialno returns the serial number as unique number * Works for Android 2.3 and above */ String hwID = android.os.SystemProperties.get("ro.serialno", "unknown"); idView.append( "hwID : " + hwID + "
" ); 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" ) ); idView.append( "serial : " + serialnum + "
" ); } catch (Exception ignored) { } String serialnum2 = null; try { Class myclass = Class.forName( "android.os.SystemProperties" ); Method[] methods = myclass.getMethods(); Object[] params = new Object[] { new String( "ro.serialno" ) , new String( "Unknown" ) }; serialnum2 = (String)(methods[2].invoke( myclass, params )); idView.append( "serial2 : " + serialnum2 + "
" ); }catch (Exception ignored) { } /* * Settings.Secure.ANDROID_ID returns the unique DeviceID * Works for Android 2.2 and above */ String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); idView.append( "AndroidID : " + androidId + "
" ); } }); } }

クラス:SystemProperties.java
package android.os;
 
 
 
/**
 
 * Gives access to the system properties store. The system properties
 
 * store contains a list of string key-value pairs.
 
 *
 
 * {@hide}
 
 */
 
public class SystemProperties
 
{
 
    public static final int PROP_NAME_MAX = 31;
 
    public static final int PROP_VALUE_MAX = 91;
 
    private static native String native_get(String key);
 
    private static native String native_get(String key, String def);
 
    private static native int native_get_int(String key, int def);
 
    private static native long native_get_long(String key, long def);
 
    private static native boolean native_get_boolean(String key, boolean def);
 
    private static native void native_set(String key, String def);
 
 
 
    /**
 
     * Get the value for the given key.
 
     * @return an empty string if the key isn't found
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     */
 
    public static String get(String key) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        return native_get(key);
 
    }
 
 
 
    /**
 
     * Get the value for the given key.
 
     * @return if the key isn't found, return def if it isn't null, or an empty string otherwise
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     */
 
    public static String get(String key, String def) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        return native_get(key, def);
 
    }
 
 
 
    /**
 
     * Get the value for the given key, and return as an integer.
 
     * @param key the key to lookup
 
     * @param def a default value to return
 
     * @return the key parsed as an integer, or def if the key isn't found or
 
     *         cannot be parsed
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     */
 
    public static int getInt(String key, int def) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        return native_get_int(key, def);
 
    }
 
 
 
    /**
 
     * Get the value for the given key, and return as a long.
 
     * @param key the key to lookup
 
     * @param def a default value to return
 
     * @return the key parsed as a long, or def if the key isn't found or
 
     *         cannot be parsed
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     */
 
    public static long getLong(String key, long def) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        return native_get_long(key, def);
 
    }
 
 
 
    /**
 
     * Get the value for the given key, returned as a boolean.
 
     * Values 'n', 'no', '0', 'false' or 'off' are considered false.
 
     * Values 'y', 'yes', '1', 'true' or 'on' are considered true.
 
     * (case insensitive).
 
     * If the key does not exist, or has any other value, then the default
 
     * result is returned.
 
     * @param key the key to lookup
 
     * @param def a default value to return
 
     * @return the key parsed as a boolean, or def if the key isn't found or is
 
     *         not able to be parsed as a boolean.
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     */
 
    public static boolean getBoolean(String key, boolean def) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        return native_get_boolean(key, def);
 
    }
 
 
 
    /**
 
     * Set the value for the given key.
 
     * @throws IllegalArgumentException if the key exceeds 32 characters
 
     * @throws IllegalArgumentException if the value exceeds 92 characters
 
     */
 
    public static void set(String key, String val) {
 
        if (key.length() > PROP_NAME_MAX) {
 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
 
        }
 
        if (val != null && val.length() > PROP_VALUE_MAX) {
 
            throw new IllegalArgumentException("val.length > " +
 
                PROP_VALUE_MAX);
 
        }
 
        native_set(key, val);
 
    }
 
}

「ReadDeviceID」activityを使用して「com.deviceid」プロジェクトを作成します.レイアウト「main.xml」を次のコードに書き換えます.

 

 

 

 

 

 


「AndroidManifest.xml」ファイルに「READ_PHONE_STATE」ライセンスを追加し、アプリケーションがインターネットにアクセスできるようにします.

 

 
    
 
 
 
    
 
        
 
            
 
                
 
                
 
            
 
        
 
 
 
    
 
   

    
 
      
 
   
 


 
出力結果
上のサンプルコードの出力結果を下図に示します.