Androidでプログラム的にデバイスのIMEI / ESNを取得する方法は?


343

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


デュアルSIM電話で両方のSIMのIMEIを取得するには、Javaリフレクションを使用します。デモはこちら
Vaibhav Jani 2013

5
@PiedPiper:IMEIはSIM固有ではありません。あなたはIMSIを考えています。
Phillip

@Phillipありがとうメイト。私は私の答えを更新しました:)
Vaibhav Jani

1
みんな.. android 6に変更点はありますか?何らかの方法でIMEIにアクセスできますか?
therealprashant 2015年

1
実行時にREAD_PHONE_STATE権限をリクエストする必要があります。それでもIMEIを取得できます
Flo We

回答:


387

あなたが電話したいandroid.telephony.TelephonyManager.getDeviceId()

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

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

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

これを行うためには。

とはいえ、これを行う場合は注意してください。アプリケーションがテレフォニースタックにアクセスする理由をユーザーが不思議に思うだけでなく、ユーザーが新しいデバイスを取得した場合にデータを移行することは難しい場合があります。

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

AndroidのバックアップAPIは、あなただけのユーザーが自分の携帯電話をリセットします(または新しいデバイスを購入)するときのために、文字列の束を永続化する軽量な方法をしたい場合もあります。


1
彼らが将来データを移行することを可能にするより良い解決策は何ですか?Googleのメールアドレス?もしそうなら、どうすればそれをシステムから引き出すことができますか?
トム

3
これを行うための最も信頼できる方法は、アプリを初めて起動したときにアカウントを作成させることです。ユーザーのメールアドレスを取得する方法はいくつかありますが(AccountManagerのドキュメントを参照)、悪意のあるユーザーがこの情報を偽造していないことを確認するには、Google Data APIの動作に関する少しの知識が必要です-これ以上は入力できません。小さなコメントボックス。;)
Trevor Johns、

1
実際には、その点については、ユーザーがIMEI / MEIDを偽造していないという保証もありません。セキュリティに懸念がある場合は、本当にユーザー名/パスワード、またはAccountManagerのgetAuthToken()メソッドを使用する必要があります(この場合も、最初にトークンを発行したサーバーでこのトークンを確認する必要があります)。
Trevor Johns、

2
Adi:デバイスIDを取得するためのコードは?上記の1つの方法+許可以外に何もありません。とはいえ、Google +ログインAPIを確認する必要があります。これは、最近のユーザー認証に推奨されるアプローチです:developer.android.com/google/play-services/auth.html
Trevor Johns

2
Android 6を実行していますか?SDK 23をターゲットにしていますか?次に、IMEIを照会する前に、実行時にREAD_PHONE_STATEを要求する必要があります
Flo We

284

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を返します。


1
エミュレータにIMEI番号を返す方法はありますか?
MikeSchem 2017年

@MikeSchem、エミュレータには意味のあるIMEI文字列がありません。
Shizhen 2018年

使用しないでください:<uses-permission android:name = "android.permission.READ_PHONE_STATE" />この権限は非常に機密性が高く、アプリはGoogle Playチームから拒否されます(2018年後半に追加された新しいセキュリティルール)。アドバイスとして、広告IDを使用することをお勧めします。
Duna、

@Tanerデュアルsimデバイスで動作しますか?(First IMEIのみを取得する必要があります)
アーノルドブラウン

READ_PHONE_STATE権限の使用に関してセキュリティ上の懸念はありますか?
viper

62

デバイスに電話機能がない場合は、次のコードを使用して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;
}

17
TextUtils.isEmpty()-> if(identifier == null || identifier .length()== 0)
Mikhaili

2
こんにちはピニャッシ、テレフォニーマネージャーから返されたデバイスIDがnullまたは空であるにもかかわらず、Secure.ANDROID_IDから読み取られた値が空ではない場合はありましたか?ありがとう
Budda

4
私が思い出せる限り、それはSIMカードのないタブレット用でした(100%確実ではありません)。
Asaf Pinhassi 2013年

Secure.ANDROID_IDは、デバイスがフォーマットされているか、ROMが出荷時設定にリセットされている場合に変更されます
shridutt kothari

Nexus7(1stGen)がnullテレフォニーデバイスIDを返します...誰もがタブレットからIMEIを取得する方法を知っていますか?
Sakiboy、2016

38

または、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_IDを再利用している非常にローエンドのAndroidスマートフォンおよびタブレットの一部が検出されていることを認識する必要があります(9774d56d682e549cがログに表示される値でした)


15
この定数は非推奨です。代わりにandroid.provider.Settings.Secure.ANDROID_IDを使用する必要があります。
mcorley、2011年

@mcorleyは、nexus 7タブレットとnexus 4にandroid.provider.Settings.Secure.ANDROID_IDを使用すると、同じ値「android_id」を返します
vuhung3990

3
@meowmeoは私にとって同じことをしましたが、私が答え(ish)の一部となったコードを使用するまでは。String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Matthias

しかし、これは出荷時設定へのリセット時に新しいANDROID_IDにリセットされませんか?リセット後も存続できる永続的なANDROID_IDが必要な場合はどうすればよいですか。
IgorGanapolsky 2016

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はnullになります。


1
これは私がIMEIを取得するために見つけている実際のコードです
Anand Savjani

2
残念ながら、Marshmallowを転送すると、実行時にこの権限を要求する必要があります。この権限は、ユーザーエクスペリエンスを妨げ、一部のユーザーを疑わしいものにする可能性があるため、理想的ではありません。
IgorGanapolsky 2016

使用しないでください:<uses-permission android:name = "android.permission.READ_PHONE_STATE" />この権限は非常に機密性が高く、Google Playチームからアプリが拒否されます(2018年後半に追加された新しいセキュリティルール)。アドバイスとして、代わりに広告IDを使用する方がよいIMEI
Duna

Android 10のソリューションは何ですか?
アミンPinjari

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;
}

2
device_unique_idの代替を表示することは非常に役立ちます
JoeGalind

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);
}
}

これがあなたや誰かを助けることを願っています。


16

新しいアップデート:

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

更新:

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

古い答え:

IMEIを一意のデバイスIDとして使用することの欠点:

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

WLAN MACアドレス文字列を使用できます(Marshmallow以降ではWLAN MACアドレスが廃止されたため、MarshmallowおよびMarshmallow +には推奨されません。偽の値が表示されます)

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

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

  • これは、すべてのタイプのデバイス(スマートフォンおよびタブレット)の固有IDです。

  • アプリケーションが再インストールされた場合、一意のままです

WLAN MACアドレスをデバイスIDとして使用することの欠点:

  • マシュマロ以上から偽の値を与えます。

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

出典:technetexperts.com


7
「IMEIはSimcardに依存しています」...これは誤りです。IMEIとIMSI番号を混同しているようです
Merlevede

2
International Mobile Station Equipment Identity(略してIMEI)は、GSMネットワーク上で実行される携帯電話を識別する番号です。私は個人的に試してみましたが、GSM電話にワイヤレスキャリアがない場合は、プログラム的にnullになります。 smartmobilephonesolutions.com/content/…–
Jamil

3
あなたは正しい、私は注意深く読みませんでした。IMEIは、SIMカードではなく、SIMカードトランシーバーに関連付けられています。悪い!
Merlevede

2
WLAN MACアドレスは、Marshmallowフォワードでは非推奨になりました。したがって、偽の値を取得します!
IgorGanapolsky 2016

1
android 6はコードで正しいWIFI MACアドレスを返しません。気づく。
zszen 2017年

15

API 26のgetDeviceId()ように減価償却されているので、次のコードを使用してAPI 26以前のバージョンに対応できます

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などのリセットできないハードウェア識別子をユーザーアプリが取得することは制限されています。


?マインドシェアは、私が法「getImei() "のための参照を見つけることができます
バイトSAM

2
確かに、getImei()の参照にはdeveloper.android.com/reference/android/telephony/… を使用てください
Muhammad Hamza Shahid

Android 10のソリューションは何ですか?
アミンPinjari

1
残念ながらAndroidの今Androidの10の訪問におけるプライバシーの変更に関する詳しい情報は、IMEIなどのハードウェア識別子を取得するには、サードパーティのアプリのために制限されているセキュリティ上の理由のために10でAminのdeveloper.android.com/about/versions/10/privacy
ムハンマドハムザ・シャヒード

Android Oreoで動作します。
Satish Shetty

10

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。


4

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

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

:GSMIMEIおよび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を返します


そしてなぜデバイスIDはnullですか?根ざしたデバイスのため。
Vishal Sojitra 2018年

Android 10のソリューションは何ですか?
アミンPinjari


3

これを試してください(常に最初の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();
        }

Android 10のソリューションは何ですか? developer.android.com/about/versions/10/privacy
Amin Pinjari

2

以下のコードを使用すると、IMEI番号が得られます。

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());

1

APIレベル11以上の場合:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));

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-->

1

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

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

IMEI(国際モバイル機器識別子)を取得し、それがAPIレベル26を超えている場合はtelephonyManager.getImei()nullとして取得するため、そのために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;
    }

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"/>

0

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

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" />

0

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

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
                }
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.