안드로이드에서 프로그래밍 방식으로 장치의 IMEI / ESN을 얻는 방법?


343

각 장치를 고유하게 식별하기 위해 IMEI (또는 CDMA 장치의 경우 ESN 번호)를 사용하고 싶습니다. 프로그래밍 방식으로 액세스하는 방법은 무엇입니까?


듀얼 SIM 폰에서 두 SIM에 대한 IMEI를 얻으려면 Java 리플렉션을 사용하십시오. 여기 데모가 있습니다
Vaibhav Jani

5
@PiedPiper : IMEI는 SIM 전용이 아닙니다. 당신은 IMSI를 생각하고 있습니다.
Phillip

@ 필립 감사합니다. 내가 업데이트 한 내 대답 :
하기 Vaibhav 야니

1
모두 .. 안드로이드 6에 어떤 변화가 있습니까? 어떤 방법으로도 IMEI에 액세스 할 수 있습니까?
therealprashant

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를 확인하십시오.

안드로이드 백업 API는 그냥 사용자가 자신의 휴대 전화를 재설정 (또는 새로운 장치를 구입) 때의 문자열의 번들을 지속 할 수있는 경량의 방법을 원하는 경우도 있습니다.


1
향후 데이터를 마이그레이션 할 수있는 더 나은 솔루션은 무엇입니까? Google 이메일 주소? 그렇다면 어떻게 그것을 시스템에서 끌어낼 수 있습니까?
Tom

3
가장 신뢰할 수있는 방법은 앱을 처음 시작할 때 계정을 만들도록하는 것입니다. 사용자의 이메일 주소를 얻는 방법은 있지만 (AccountManager의 문서 참조) 악의적 인 사용자가이 정보를 위조하지 않았는지 확인하려면 Google Data API의 작동 방식에 대한 약간의 지식이 필요합니다. 작은 코멘트 박스. ;)
Trevor Johns

1
실제로 그 문제에 대해 사용자가 IMEI / MEID를 위조하지 않았다는 보장은 없습니다. 보안이 우려되는 경우 AccountManager에서 사용자 이름 / 비밀번호 또는 getAuthToken () 메소드를 사용해야합니다 (그리고 다시이 토큰을 원래 발행 한 서버에서 확인해야합니다).
Trevor Johns

2
Adi : 장치 ID를 얻기위한 코드? 위에서 언급 한 방법 + 권한 이상의 것은 없습니다. 즉, 요즘 사용자 인증에 권장되는 접근 방식 인 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

@ MikeSchem, 에뮬레이터에는 의미있는 IMEI 문자열이 없습니다.
shizhen

사용하지 마십시오 : <uses-permission android : name = "android.permission.READ_PHONE_STATE"/>이 권한은 매우 민감하므로 Google Play 팀에서 앱 거부를 얻을 수 있습니다 (2018 년 말에 추가 된 새로운 보안 규칙). 조언으로 광고 ID를 사용하는 것이 좋습니다.
Duna

@Taner 그것은 듀얼 SIM 장치에서 작동합니까? (First IMEI 만 필요)
Arnold Brown

READ_PHONE_STATE권한 사용에 대한 보안 문제가 있습니까?
독사

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 (식별자 == null || identifier .length () == 0)
Mikhaili

2
안녕하세요 Pinhassi, 전화 관리자가 반환 한 장치 ID가 null이거나 비어 있지만 Secure.ANDROID_ID에서 읽은 값이 비어 있지 않은 경우가 있습니까? 감사합니다
Budda

4
내가 기억할 수있는 한 SIM 카드가없는 태블릿 용이었습니다 (100 % 확실하지는 않습니다).
Asaf Pinhassi 2016 년

Secure.ANDROID_ID은 변경 장치가 포맷 또는 롬 공장 재설정하는 경우
shridutt Kothari의

내 Nexus7 (1stGen) null이 전화 장치 ID로 반환 됩니다 ... 태블릿에서 IMEI를 얻는 방법을 아는 사람이 있습니까?
Sakiboy

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를 재사용하는 것으로 나타났습니다 (9774d56d682e549c는 로그에 표시되는 값임)


15
이 상수는 더 이상 사용되지 않습니다. 대신 android.provider.Settings.Secure.ANDROID_ID를 사용해야합니다.
mcorley

난 넥서스 7 태블릿 넥서스 4 android.provider.Settings.Secure.ANDROID_ID @mcorley를 사용하는 경우는 같은 값이 'android_id 이익 환원
vuhung3990

3
@meowmeo는 이제 답변의 일부인 코드를 사용할 때까지 나에게도 똑같이했습니다 (ish). String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Matthias

하지만 초기화시 새 ANDROID_ID로 재설정되지 않습니까? 재설정 후에도 지속 가능한 영구 ANDROID_ID가 필요한 경우 어떻게해야합니까?
IgorGanapolsky

35

보낸 사람 : http://mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/ :

다음 코드는 IMEI 수의 Android 장치를 얻는 데 도움이됩니다.

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

Android Manifest에 필요한 권한 :

android.permission.READ_PHONE_STATE

참고 : 휴대폰 IMEI로 작동 할 수없는 태블릿 또는 장치의 경우 null이됩니다.


1
이것은 내가 찾은 실제 코드입니다 IMEI
Anand Savjani

2
불행히도 Marshmallow를 사용하면 런타임에이 권한을 요청해야합니다. 이 권한은 사용자 경험을 방해하고 일부 사용자를 의심하게 만들 수 있으므로 이상적이지 않습니다.
IgorGanapolsky

사용하지 마십시오 : <uses-permission android : name = "android.permission.READ_PHONE_STATE"/>이 권한은 매우 민감하므로 Google Play 팀에서 앱 거부를받을 수 있습니다 (2018 년 말에 추가 된 새로운 보안 규칙). 조언으로 광고 ID를 사용하는 것이 좋습니다. IMEI
Duna

안드로이드 10의 해결책은 무엇입니까?
Amin Pinjari

23

IMEI (International Mobile Equipment Identifier) 를 얻는 방법

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 주소가 더 이상 사용되지 않습니다. Trevor Johns의 답변을 따르십시오.

최신 정보:

장치를 고유하게 식별하기 위해 Secure.ANDROID_ID 를 사용할 수 있습니다 .

기존 답변 :

IMEI를 고유 한 장치 ID로 사용하는 단점 :

  • IMEI는 장치의 Simcard 슬롯에 의존하므로 Simcard를 사용하지 않는 장치에 대해서는 IMEI를 얻을 수 없습니다. 듀얼 sim 장치에서는 simcard를위한 2 개의 슬롯이있는 것과 동일한 장치에 대해 2 개의 서로 다른 IMEI를 얻습니다.

WLAN MAC 주소 문자열을 사용할 수 있습니다 (Marshmallow에서 WLAN MAC 주소가 더 이상 사용되지 않으므로 Marshmallow 및 Marshmallow +에 권장되지 않음). 가짜 값을 얻습니다.

WLAN MAC 주소를 사용하여 안드로이드 폰의 고유 ID도 얻을 수 있습니다. MAC 주소는 모든 장치에 고유하며 모든 종류의 장치에서 작동합니다.

WLAN MAC 주소를 장치 ID로 사용하는 장점 :

  • 모든 유형의 장치 (스마트 폰 및 태블릿)에 대한 고유 식별자입니다.

  • 응용 프로그램을 다시 설치해도 고유하게 유지됩니다.

WLAN MAC 주소를 장치 ID로 사용하는 단점 :

  • 마시멜로 이상의 가짜 가치를 제공하십시오.

  • 기기에 Wi-Fi 하드웨어가 없으면 null MAC 주소가 표시되지만 일반적으로 대부분의 Android 기기에는 Wi-Fi 하드웨어가 있으며 시장에 와이파이 하드웨어가없는 기기는 거의 없습니다.

출처 : technetexperts.com


7
"IMEI는 Simcard에 의존합니다"... 이것은 거짓입니다. IMEI를 IMSI 번호와 혼동하는 것 같습니다
Merlevede

2
줄여서 국제 이동국 장비 식별 (IMEI)은 GSM 네트워크에서 실행되는 휴대폰을 식별하는 번호입니다. 나는 개인적으로 그것을 시도했으며 GSM 전화에 무선 통신 사업자가 없으면 프로그래밍 방식으로 null을 제공합니다. smartmobilephonesolutions.com/content/…
Jamil

3
네 말이 맞아, 나는주의 깊게 읽지 않았다. IMEI는 SIM 카드가 아닌 SIM 카드 송수신기에 연결됩니다. 내 잘못이야!
Merlevede

2
마시멜로에서는 WLAN MAC 주소 가 더 이상 사용되지 않습니다. 따라서 가짜 가치를 얻게됩니다!
IgorGanapolsky

1
안드로이드 6은 코드로 올바른 WIFI MAC 주소를 반환하지 않습니다. 주목하십시오.
zszen

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 byte

2
물론 getImei () 참조 를 위해 developer.android.com/reference/android/telephony/… 를 사용하십시오
Muhammad Hamza Shahid

안드로이드 10의 해결책은 무엇입니까?
Amin Pinjari

1
안타깝게도 Android 10에서 보안상의 이유로 Amin은 이제 Android 10의 개인 정보 변경에 대한 자세한 내용을 보려면 타사 앱이 IMEI와 같은 하드웨어 식별자를 얻는 것이 제한됩니다. developer.android.com/about/versions/10/privacy
Muhammad Hamza Shahid

Android Oreo에서 작동합니다.
Satish Shetty

10

TelephonyManager의 getDeviceId () 메소드는 고유 한 장치 ID (예 : GSM의 경우 IMEI, CDMA 전화의 경우 MEID 또는 ESN)를 리턴합니다. 장치 ID를 사용할 수 없으면 null을 반환합니다.

자바 코드

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

를 들어 GSMIMEICDMA 전화의 경우 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();
}

NULL을 반환 하는 경우 장치 ID를 사용할 수 없습니다 .


왜 장치 ID가 null입니까? 루팅 된 기기로 인해
Vishal Sojitra

안드로이드 10의 해결책은 무엇입니까?
Amin 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();
        }

안드로이드 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

모든 안드로이드 버전에 대한 처리 권한 및 비교 검사를 통해 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 (국제 모바일 기기 식별자) 및 IT 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.