368

各デバイスを一意に識別するために、IMEI(またはCDMAデバイスの場合はESN番号)を使用したいと思います。プログラムでこれにアクセスするにはどうすればよいですか?

4

22 に答える 22

408

呼び出したいandroid.telephony.TelephonyManager.getDeviceId()

これにより、デバイスを一意に識別する文字列(GSMではIMEI、CDMAではMEID)が返されます。

次の権限が必要ですAndroidManifest.xml

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

これを行うためには。

そうは言っても、これを行う場合は注意が必要です。ユーザーは、アプリケーションがテレフォニースタックにアクセスしている理由を疑問視するだけでなく、ユーザーが新しいデバイスを入手した場合にデータを移行するのが難しい場合があります。

更新:以下のコメントで述べられているように、これはユーザーを認証するための安全な方法ではなく、プライバシーの懸念を引き起こします。推奨されません。代わりに、摩擦のないログインシステムを実装する場合は、 Google +LoginAPIをご覧ください。

Android Backup APIは、ユーザーがスマートフォンをリセットしたとき(または新しいデバイスを購入したとき)に文字列のバンドルを保持するための軽量な方法が必要な場合にも利用できます。

于 2009-12-29T01:01:10.530 に答える
289

Trevor Johnsの回答に加えて、これを次のように使用できます。

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();

また、Manifest.xmlファイルに次の権限を追加する必要があります。

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

エミュレーターでは、おそらく「00000...」のような値を取得します。デバイスIDが使用できない場合、getDeviceId()はNULLを返します。

于 2010-06-09T19:44:59.890 に答える
64

デバイスに電話機能がない場合は、次のコードを使用してIMEIを取得するか、代わりにSecure.ANDROID_IDを使用します。

/**
 * Returns the unique identifier for the device
 *
 * @return unique identifier for the device
 */
public String getDeviceIMEI() {
    String deviceUniqueIdentifier = null;
    TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    if (null != tm) {
        deviceUniqueIdentifier = tm.getDeviceId();
    }
    if (null == deviceUniqueIdentifier || 0 == deviceUniqueIdentifier.length()) {
        deviceUniqueIdentifier = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
    }
    return deviceUniqueIdentifier;
}
于 2013-04-15T12:58:54.597 に答える
41

または、Android.Provider.Settings.SystemのANDROID_ID設定を使用できます(ここでstrazerre.comで説明されています)。

これには、特別なアクセス許可を必要としないという利点がありますが、別のアプリケーションに書き込みアクセス権があり、それを変更すると変更される可能性があります(これは明らかに珍しいことですが、不可能ではありません)。

参考までに、ブログのコードを次に示します。

import android.provider.Settings;
import android.provider.Settings.System;   

String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);

実装上の注意IDがシステムアーキテクチャにとって重要である場合、実際には、非常にローエンドのAndroid携帯電話とタブレットの一部が同じANDROID_IDを再利用していることがわかっていることに注意する必要があります(9774d56d682e549cはログに表示される値でした)

于 2010-10-20T10:22:15.963 に答える
35

差出人:http://mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/

次のコードは、AndroidデバイスのIMEI番号を取得するのに役立ちます。

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String device_id = tm.getDeviceId();

Androidマニフェストに必要な権限:

android.permission.READ_PHONE_STATE

注:携帯電話として機能できないタブレットやデバイスの場合、IMEIは無効になります。

于 2012-04-28T17:32:30.153 に答える
23

IMEI(国際モバイル機器識別子)を取得するには

public String getIMEI(Activity activity) {
    TelephonyManager telephonyManager = (TelephonyManager) activity
            .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

デバイスの一意のIDを取得するには

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}
于 2014-09-24T04:17:56.607 に答える
20

Android 6.0以降ではゲームが変更されたため、これを使用することをお勧めします。

実行時に実行するのが最善の方法です。そうしないと、アクセス許可エラーが発生します。

   /**
 * A loading screen after AppIntroActivity.
 */
public class LoadingActivity extends BaseActivity {
private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0;
private TextView loading_tv2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_loading);

    //trigger 'loadIMEI'
    loadIMEI();
    /** Fading Transition Effect */
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}

/**
 * Called when the 'loadIMEI' function is triggered.
 */
public void loadIMEI() {
    // Check if the READ_PHONE_STATE permission is already available.
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED) {
        // READ_PHONE_STATE permission has not been granted.
        requestReadPhoneStatePermission();
    } else {
        // READ_PHONE_STATE permission is already been granted.
        doPermissionGrantedStuffs();
    }
}



/**
 * Requests the READ_PHONE_STATE permission.
 * If the permission has been denied previously, a dialog will prompt the user to grant the
 * permission, otherwise it is requested directly.
 */
private void requestReadPhoneStatePermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.READ_PHONE_STATE)) {
        // Provide an additional rationale to the user if the permission was not granted
        // and the user would benefit from additional context for the use of the permission.
        // For example if the user has previously denied the permission.
        new AlertDialog.Builder(LoadingActivity.this)
                .setTitle("Permission Request")
                .setMessage(getString(R.string.permission_read_phone_state_rationale))
                .setCancelable(false)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        //re-request
                        ActivityCompat.requestPermissions(LoadingActivity.this,
                                new String[]{Manifest.permission.READ_PHONE_STATE},
                                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
                    }
                })
                .setIcon(R.drawable.onlinlinew_warning_sign)
                .show();
    } else {
        // READ_PHONE_STATE permission has not been granted yet. Request it directly.
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
                MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    }
}

/**
 * Callback received when a permissions request has been completed.
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {

    if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) {
        // Received permission result for READ_PHONE_STATE permission.est.");
        // Check if the only required permission has been granted
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // READ_PHONE_STATE permission has been granted, proceed with displaying IMEI Number
            //alertAlert(getString(R.string.permision_available_read_phone_state));
            doPermissionGrantedStuffs();
        } else {
            alertAlert(getString(R.string.permissions_not_granted_read_phone_state));
          }
    }
}

private void alertAlert(String msg) {
    new AlertDialog.Builder(LoadingActivity.this)
            .setTitle("Permission Request")
            .setMessage(msg)
            .setCancelable(false)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // do somthing here
                }
            })
            .setIcon(R.drawable.onlinlinew_warning_sign)
            .show();
}


public void doPermissionGrantedStuffs() {
    //Have an  object of TelephonyManager
    TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    //Get IMEI Number of Phone  //////////////// for this example i only need the IMEI
    String IMEINumber=tm.getDeviceId();

    /************************************************
     * **********************************************
     * This is just an icing on the cake
     * the following are other children of TELEPHONY_SERVICE
     *
     //Get Subscriber ID
     String subscriberID=tm.getDeviceId();

     //Get SIM Serial Number
     String SIMSerialNumber=tm.getSimSerialNumber();

     //Get Network Country ISO Code
     String networkCountryISO=tm.getNetworkCountryIso();

     //Get SIM Country ISO Code
     String SIMCountryISO=tm.getSimCountryIso();

     //Get the device software version
     String softwareVersion=tm.getDeviceSoftwareVersion()

     //Get the Voice mail number
     String voiceMailNumber=tm.getVoiceMailNumber();


     //Get the Phone Type CDMA/GSM/NONE
     int phoneType=tm.getPhoneType();

     switch (phoneType)
     {
     case (TelephonyManager.PHONE_TYPE_CDMA):
     // your code
     break;
     case (TelephonyManager.PHONE_TYPE_GSM)
     // your code
     break;
     case (TelephonyManager.PHONE_TYPE_NONE):
     // your code
     break;
     }

     //Find whether the Phone is in Roaming, returns true if in roaming
     boolean isRoaming=tm.isNetworkRoaming();
     if(isRoaming)
     phoneDetails+="\nIs In Roaming : "+"YES";
     else
     phoneDetails+="\nIs In Roaming : "+"NO";


     //Get the SIM state
     int SIMState=tm.getSimState();
     switch(SIMState)
     {
     case TelephonyManager.SIM_STATE_ABSENT :
     // your code
     break;
     case TelephonyManager.SIM_STATE_NETWORK_LOCKED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_PIN_REQUIRED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_PUK_REQUIRED :
     // your code
     break;
     case TelephonyManager.SIM_STATE_READY :
     // your code
     break;
     case TelephonyManager.SIM_STATE_UNKNOWN :
     // your code
     break;

     }
     */
    // Now read the desired content to a textview.
    loading_tv2 = (TextView) findViewById(R.id.loading_tv2);
    loading_tv2.setText(IMEINumber);
}
}

これがあなたや誰かに役立つことを願っています。

于 2016-05-02T02:15:19.573 に答える
18

API 26getDeviceId()と同様に減価償却されるため、次のコードを使用してAPI26以前のバージョンに対応できます。

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String imei="";
if (android.os.Build.VERSION.SDK_INT >= 26) {
  imei=telephonyManager.getImei();
}
else
{
  imei=telephonyManager.getDeviceId();
}

READ_PHONE_STATE上記のコードを使用するための許可リクエストを追加することを忘れないでください。

更新:Android 10以降、ユーザーアプリがIMEIなどのリセット不可能なハードウェア識別子を取得するように制限されています。

于 2017-08-17T11:10:38.607 に答える
17

新しいアップデート:

Androidバージョン6以降では、WLANMACアドレスは非推奨になりました。TrevorJohnsの回答に従ってください。

アップデート:

デバイスを一意に識別するには、Secure.ANDROID_IDを使用できます。

古い答え:

IMEIを一意のデバイスIDとして使用することのデメリット:

  • IMEIはデバイスのSimcardスロットに依存しているため、Simcardを使用しないデバイスのIMEIを取得することはできません。デュアルSIMデバイスでは、SIMカード用のスロットが2つあるため、同じデバイスに対して2つの異なるIMEIを取得します。

WLAN MACアドレス文字列を使用できます(Marshmallow以降ではWLAN MACアドレスが非推奨になっているため、MarshmallowおよびMarshmallow +には推奨されません。したがって、偽の値が取得されます)

WLAN MACアドレスを使用して、Androidフォンの一意のIDを取得することもできます。MACアドレスはすべてのデバイスに固有であり、すべての種類のデバイスで機能します。

デバイスIDとしてWLANMACアドレスを使用する利点:

  • これは、すべてのタイプのデバイス(スマートフォンおよびタブレット)の一意の識別子です。

  • アプリケーションを再インストールしても一意のままです

デバイスIDとしてWLANMACアドレスを使用するデメリット:

  • マシュマロ以上の偽の価値をあなたに与えてください。

  • デバイスにwifiハードウェアがない場合は、nullのMACアドレスを取得しますが、一般的に、ほとんどのAndroidデバイスにはwifiハードウェアがあり、wifiハードウェアがないデバイスは市場にほとんどありません。

出典:technetexperts.com

于 2016-07-07T16:31:28.837 に答える
11

TelephonyManagerのメソッドgetDeviceId()は、一意のデバイスIDを返します。たとえば、GSMの場合はIMEI、CDMA電話の場合はMEIDまたはESNです。デバイスIDが使用できない場合はnullを返します。

Javaコード

package com.AndroidTelephonyManager;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;

public class AndroidTelephonyManager extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView textDeviceID = (TextView)findViewById(R.id.deviceid);

    //retrieve a reference to an instance of TelephonyManager
    TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

    textDeviceID.setText(getDeviceID(telephonyManager));

}

String getDeviceID(TelephonyManager phonyManager){

 String id = phonyManager.getDeviceId();
 if (id == null){
  id = "not available";
 }

 int phoneType = phonyManager.getPhoneType();
 switch(phoneType){
 case TelephonyManager.PHONE_TYPE_NONE:
  return "NONE: " + id;

 case TelephonyManager.PHONE_TYPE_GSM:
  return "GSM: IMEI=" + id;

 case TelephonyManager.PHONE_TYPE_CDMA:
  return "CDMA: MEID/ESN=" + id;

 /*
  *  for API Level 11 or above
  *  case TelephonyManager.PHONE_TYPE_SIP:
  *   return "SIP";
  */

 default:
  return "UNKNOWN: ID=" + id;
 }

}
}

XML

<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/hello">
<textview android:id="@+id/deviceid" android:layout_height="wrap_content" android:layout_width="fill_parent">
</textview></textview></linearlayout> 

マニフェストファイルに必要なREAD_PHONE_STATEのアクセス許可。

于 2013-06-17T07:20:54.353 に答える
5

このTelephonyManagerTELEPHONY_SERVICE関数を使用して、一意のデバイスIDを取得できます。権限が必要です:READ_PHONE_STATE

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

たとえば、GSMの場合はIMEI 、CDMA電話の場合はMEIDまたはESNです。

/**
 * Gets the device unique id called IMEI. Sometimes, this returns 00000000000000000 for the
 * rooted devices.
 **/
public static String getDeviceImei(Context ctx) {
    TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

デバイスIDが使用できない場合はnullを返します

于 2017-09-04T08:19:52.377 に答える
5

これを試してください(常に最初のIMEIを取得する必要があります)

TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(LoginActivity.this,Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) {

         return;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getImei(0);
                }else{
                    IME = mTelephony.getImei();
                }
            }else{
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getDeviceId(0);
                } else {
                    IME = mTelephony.getDeviceId();
                }
            }
        } else {
            IME = mTelephony.getDeviceId();
        }
于 2019-03-01T05:06:12.907 に答える
3

以下のコードを使用すると、IMEI番号がわかります。

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());
于 2013-12-17T07:00:19.390 に答える
3

このメソッドgetDeviceId()は非推奨です。これには新しい方法がありますgetImei(int)

こちらをチェック

于 2018-06-28T13:41:59.327 に答える
2

AndroidManifest.xmlには次の権限が必要です。

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

IMEI(国際モバイル機器識別子)を取得し、APIレベル26を超える場合はnullとして取得するtelephonyManager.getImei()ため、一意の識別子としてANDROID_IDを使用します。

 public static String getIMEINumber(@NonNull final Context context)
            throws SecurityException, NullPointerException {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imei;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            assert tm != null;
            imei = tm.getImei();
            //this change is for Android 10 as per security concern it will not provide the imei number.
            if (imei == null) {
                imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            }
        } else {
            assert tm != null;
            if (tm.getDeviceId() != null && !tm.getDeviceId().equals("000000000000000")) {
                imei = tm.getDeviceId();
            } else {
                imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            }
        }

        return imei;
    }
于 2020-01-16T14:13:08.067 に答える
1

APIレベル11以上の場合:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));
于 2013-05-24T12:39:07.147 に答える
1

すべてのAndroidバージョンの処理許可と比較可能性チェックを備えたDeviceId(IMEI)を取得するためのKotlinコード:

 val  telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        == PackageManager.PERMISSION_GRANTED) {
        // Permission is  granted
        val imei : String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)  telephonyManager.imei
        // older OS  versions
        else  telephonyManager.deviceId

        imei?.let {
            Log.i("Log", "DeviceId=$it" )
        }

    } else {  // Permission is not granted

    }

また、この権限をAndroidManifest.xmlに追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- IMEI-->
于 2018-12-23T12:06:01.067 に答える
1

以下のコードを使用してください:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        String[] permissions = {Manifest.permission.READ_PHONE_STATE};
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(permissions, READ_PHONE_STATE);
        }
    } else {
        try {
            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            String imei = telephonyManager.getDeviceId();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

そして、次のコードでonRequestPermissionsResultメソッドを呼び出します。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case READ_PHONE_STATE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                try {
                    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    String imei = telephonyManager.getDeviceId();

                } catch (Exception e) {
                    e.printStackTrace();
                }
    }
}

AndroidManifest.xmlに次の権限を追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
于 2020-02-11T10:19:30.240 に答える
1

Android10の場合次のコードが機能しています。

val uid: String = Settings.Secure.getString(ctx.applicationContext.contentResolver, Settings.Secure.ANDROID_ID)
if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            imei = when {
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> {
                    uid
                }
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
                    telephonyManager.imei
                }
                else -> {
                    telephonyManager.deviceId
                }
            }
        }

于 2020-05-26T16:11:47.213 に答える
0

Kotlinバージョンをお探しの場合は、次のようなものを使用できます。

private fun telephonyService() {
    val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    val imei = if (android.os.Build.VERSION.SDK_INT >= 26) {
        Timber.i("Phone >= 26 IMEI")
        telephonyManager.imei
    } else {
        Timber.i("Phone IMEI < 26")
        telephonyManager.deviceId
    }

    Timber.i("Phone IMEI $imei")
}

注:checkSelfPermissionまたは使用するメソッドを使用telephonyService()した権限チェックで上記をラップする必要があります。

また、この権限をマニフェストファイルに追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
于 2018-12-02T10:29:18.977 に答える
0

andorid 10+または29+携帯電話からimei番号を取得する方法はありません。ここでは、デバイスのimei番号を作成するために使用される代替機能です。

public  static String getDeviceID(){
    String devIDShort = "35" + //we make this look like a valid IMEI
            Build.BOARD.length()%10+ Build.BRAND.length()%10 +
            Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
            Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
            Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
            Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
            Build.TAGS.length()%10 + Build.TYPE.length()%10 +
            Build.USER.length()%10 ; //13 digits

    return  devIDShort;
}
于 2021-07-13T07:19:41.877 に答える
0

リセット不可能なデバイス識別子の制限

Android 10以降、アプリはREAD_PRIVILEGED_PHONE_STATE、IMEIとシリアル番号の両方を含むデバイスのリセット不可能な識別子にアクセスするための特権権限を持っている必要があります。

于 2021-08-01T16:21:38.347 に答える