Android'de cihazın programlı IMEI / ESN'sini nasıl alabilirim?


343

Her cihazı benzersiz bir şekilde tanımlamak için IMEI'yi (veya CDMA cihazları için ESN numarasını) kullanmak istiyorum. Buna programlı olarak nasıl erişilir?


Çift SIM Telefonlarda her iki SIM için IMEI almak için Java yansımalarını kullanın. Demoyu
izleyin

5
@PiedPiper: IMEI, SIM'e özgü değildir. Siz IMSI'yi düşünüyorsunuz.
Phillip

@Phillip Teşekkürler dostum. Cevabımı güncelledim :)
Vaibhav Jani

1
Herkes .. Android 6'da bazı değişiklikler var mı? hala IMEI'ye bazı yollarla erişebilir miyiz?
therealprashant

1
Çalışma zamanında READ_PHONE_STATE iznini istemeniz gerekir, o zaman hala IMEI
Flo We

Yanıtlar:


387

Aramak istiyorsun android.telephony.TelephonyManager.getDeviceId().

Bu, cihazı benzersiz olarak tanımlayan her dizeyi döndürür (GSM'de IMEI, CDMA için MEID).

Aşağıdaki izinlere ihtiyacınız olacak AndroidManifest.xml:

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

bunu yapmak için.

Olduğu söyleniyor, bunu yaparken dikkatli olun. Kullanıcılar, uygulamanızın telefon yığınlarına neden eriştiğini merak etmekle kalmaz, kullanıcı yeni bir cihaz alırsa verilerin taşınması zor olabilir.

Güncelleme: Aşağıdaki yorumlarda belirtildiği gibi, bu, kullanıcıların kimliğini doğrulamanın güvenli bir yolu değildir ve gizlilik endişelerini gündeme getirir. Tavsiye edilmez. Bunun yerine, sürtünmesiz bir giriş sistemi uygulamak istiyorsanız Google+ Giriş API'sına bakın .

Android Yedekleme API sadece bir kullanıcı telefonunu sıfırlar (veya yeni bir cihaz satın alır) ne zaman için dizeleri bir paket olmaya devam edecek bir hafif şekilde isterseniz de mevcuttur.


1
Gelecekte veri taşımalarını sağlayacak daha iyi bir çözüm ne olabilir? Google e-posta adresi? Öyleyse bunu sistemden nasıl çıkarabilirim?
Tom

3
Bunu yapmanın en güvenilir yolu, uygulamanızı ilk başlattıklarında bir hesap oluşturmalarını sağlamaktır. Kullanıcının e-posta adresini almanın yolları vardır (AccountManager'daki dokümanlara bakın), ancak kötü niyetli bir kullanıcının bu bilgileri sahte yapmadığını doğrulamak için Google Veri API'larının nasıl çalıştığı hakkında biraz bilgi gerekir - buna koyabildiğimden daha fazla küçük yorum kutusu. ;)
Trevor Johns

1
Aslında, bu nedenle, kullanıcının IMEI / MEID'sini de takmadığının garantisi yoktur. Güvenlikle ilgili herhangi bir endişeniz varsa, gerçekten bir kullanıcı adı / parola veya AccountManager'da getAuthToken () yöntemini kullanmanız gerekir (ve yine, bu belirteci ilk olarak veren sunucu ile doğrulamanız gerekir).
Trevor Johns

2
Adi: Cihaz kimliğini alma kodu? Yukarıda bahsettiğim tek yöntem + izinden başka bir şey yok. Bununla birlikte, bu günlerde kullanıcıların kimliğini doğrulamak için önerilen yaklaşım olan Google+ Giriş API'sını incelemelisiniz: developer.android.com/google/play-services/auth.html
Trevor Johns

2
Android 6 çalışıyor mu? SDK 23'ü hedefliyor musunuz? Ardından, IMEI
Flo We

284

Trevor Johns'ın cevabına ek olarak, bunu aşağıdaki gibi kullanabilirsiniz:

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

Ve Manifest.xml dosyanıza aşağıdaki izni eklemelisiniz:

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

Emülatörde muhtemelen "00000 ..." değerine sahip olacaksınız. Aygıt kimliği yoksa getDeviceId () işlevi NULL döndürür.


1
Emülatörün bir IMEI numarası döndürmesini sağlamanın bir yolu var mı?
17'de MikeSchem

@MikeSchem, öykünücünün anlamlı bir IMEI dizesi yok.
shizhen

Kullanmayın: <kullanımları-izin android: name = "android.permission.READ_PHONE_STATE" /> bu izin çok hassas, Google Play Ekibi'nden Uygulama Reddedildi'yi alabilirsiniz (2018'in sonlarına yeni güvenlik kuralları eklenmiştir). Tavsiye olarak Reklam Kimliği kullanın.
Duna

@Taner Dual sim cihazında çalışır mı? (Sadece İlk IMEI'yi almanız gerekir)
Arnold Brown

READ_PHONE_STATEİzin kullanmak için herhangi bir güvenlik sorunu var mı ?
engerek

62

IMEI almak için aşağıdaki kodu kullanıyorum veya cihaz telefon yetenekleri olmadığında alternatif olarak Secure.ANDROID_ID kullanıyorum:

/**
 * 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 (tanımlayıcı == null || tanımlayıcı .length () == 0)
Mikhaili

2
Merhaba Pinhassi, Telefon yöneticisi tarafından döndürülen cihaz kimliğinin boş veya boş olduğu, ancak Secure.ANDROID_ID öğesinden okunan değerin boş olmadığı herhangi bir durumunuz oldu mu? Teşekkür ederim
Budda

4
Hatırlayabildiğim kadarıyla SIM kartı olmayan tabletler içindi (ama% 100 emin değilim).
Asaf Pinhassi

Cihaz biçimlendirilmişse veya rom fabrika
ayarlarına

Nexus7 cihazım (1stGen) nulltelefon cihazına geri dönüyor ... Herkes bir tabletten IMEI almayı biliyor mu?
Sakiboy

38

Veya Android.Provider.Settings.System (burada strazerre.com açıklandığı gibi ) ANDROID_ID ayarını kullanabilirsiniz .

Bunun özel izinler gerektirmemesi avantajı vardır, ancak başka bir uygulamanın yazma erişimi varsa ve değiştirirse değişebilir (görünüşte olağandışı ancak imkansız değildir).

Sadece referans için blogdaki kod:

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

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

Uygulama notu : Kimlik, sistem mimarisi için kritikse, pratikte çok düşük uçlu Android telefonların ve tabletlerin bazılarının aynı ANDROID_ID'yi (9774d56d682e549c) günlüklerimizde gösterilen değer olarak kullandığını fark etmeniz gerekir.


15
Bu sabit kullanımdan kaldırılmıştır. Bunun yerine android.provider.Settings.Secure.ANDROID_ID;
mcorley

i bağ 7 tablet ve bağ 4 android.provider.Settings.Secure.ANDROID_ID kullanıldığında @mcorley aynı değer 'android_id' dönüş
vuhung3990

3
Şu anda cevabın bir parçası olan kodu (ish) kullanana kadar @meowmeo benim için aynısını yaptı. String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Matthias

Ancak fabrika ayarlarına sıfırlandıktan sonra bu yeni bir ANDROID_ID değerine sıfırlanmaz mı? Sıfırlamalardan kurtulabilecek kalıcı bir ANDROID_ID'ye ihtiyacım olursa ne olur?
IgorGanapolsky

35

Gönderen: http://mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/ :

Aşağıdaki kod, android cihazların IMEI sayısını elde etmeye yardımcı olur:

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

Android Bildiriminde gerekli izinler:

android.permission.READ_PHONE_STATE

NOT: Cep Telefonu olarak görev yapamayan tabletler veya aygıtlar durumunda IMEI geçersiz olacaktır.


1
Bu IMEI almak için buluyorum gerçek kod
Anand Savjani

2
Ne yazık ki, şimdi Marshmallow ile çalışma zamanında bu izni istemelisiniz. Bu izin, kullanıcı deneyimini bozduğundan ve bazı kullanıcıları şüpheli hale getirebileceğinden ideal değildir.
IgorGanapolsky

Kullanmayın: <kullanımları-izin android: name = "android.permission.READ_PHONE_STATE" /> bu izin çok hassas, Google Play Ekibi'nden Uygulama Reddedildi'yi alabilirsiniz (2018'in sonlarına yeni güvenlik kuralları eklenmiştir). Tavsiye olarak daha iyi Reklam Kimliği kullanın IMEI
Duna

android 10 için çözüm nedir?
Amin Pinjari

23

almak için IMEI (Uluslararası Mobil Ekipman tanımlayıcı)

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

cihazın benzersiz kimliğini almak için

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}

2
Device_unique_id alternatifini göstermek gerçekten yararlı
JoeGalind

20

Android 6.0+ için oyun değişti, bu yüzden bunu kullanmanızı öneririz;

Gitmenin en iyi yolu çalışma zamanı sırasında izin hataları almaktır.

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

Umarım bu size veya birisine yardımcı olur.


16

Yeni güncelleme:

Android Sürüm 6 ve Üstü için WLAN MAC Adresi kullanımdan kaldırıldı, Trevor Johns yanıtını takip edin

Güncelleme:

Cihazların benzersiz bir şekilde tanımlanması için Secure.ANDROID_ID kullanabilirsiniz .

Eski Cevap:

Benzersiz Aygıt Kimliği olarak IMEI kullanmanın dezavantajları:

  • IMEI, cihazın Simcard yuvasına bağlıdır, bu nedenle Simcard kullanmayan cihazlar için IMEI almak mümkün değildir. Dual sim cihazlarda, simcard için 2 yuvaya sahip olduğu için aynı cihaz için 2 farklı IMEI alırız.

WLAN MAC Adres dizesini kullanabilirsiniz (Marshmallow ve Marshmallow + için Önerilmez, çünkü WLAN MAC Adresi Marshmallow'da ileriye itilmiştir. Böylece sahte bir değer elde edersiniz)

WLAN MAC adresini kullanarak android telefonlar için Benzersiz Kimlik alabiliriz. MAC adresi tüm cihazlar için benzersizdir ve her türlü cihaz için çalışır.

Cihaz Kimliği olarak WLAN MAC adresini kullanmanın avantajları:

  • Tüm cihaz türleri (akıllı telefonlar ve tabletler) için benzersiz bir tanımlayıcıdır.

  • Uygulama yeniden yüklendiğinde benzersiz kalır

Aygıt Kimliği olarak WLAN MAC adresini kullanmanın dezavantajları:

  • Marshmallow ve üzeri için sahte bir değer verin.

  • Cihaz wifi donanımına sahip değilse, boş MAC adresi alırsınız, ancak genellikle Android cihazların çoğunun wifi donanımına sahip olduğu ve pazarda wifi donanımı olmayan çok az cihaz olduğu görülür.

KAYNAK: technetexperts.com


7
"IMEI Simcard'a bağımlı" ... Bu yanlış.
IMEI'yi

2
Uluslararası Mobil İstasyon Donanım Kimliği veya kısaca IMEI, GSM şebekesinde çalışan cep telefonlarını tanımlayan bir numaradır. Şahsen denedim ve GSM Telefonda kablosuz taşıyıcı yoksa bana programlı olarak boş verir. smartmobilephonesolutions.com/content/…
Jamil

3
Haklısın, dikkatle okumadım. IMEI, SIM kartla değil, SIM kart alıcı-vericisi ile ilişkilidir. Benim hatam!
Merlevede

2
WLAN MAC Adresi ileri Marshmallow'da kullanımdan kaldırıldı. Böylece sahte bir değer elde edersiniz!
IgorGanapolsky

1
android 6 dont kodu ile doğru WIFI MAC Adresi dönmeyin. Farketmek.
zszen

15

API 26'da getDeviceId()olduğu gibi amortismana tabi tutulduğundan API 26 ve önceki sürümleri sağlamak için aşağıdaki kodu kullanabilirsiniz

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_STATEYukarıdaki kodu kullanmak için izin istekleri eklemeyi unutmayın .

GÜNCELLEME: Android 10'dan itibaren, kullanıcı uygulamalarının IMEI gibi sıfırlanamayan donanım tanımlayıcıları alması sınırlıdır.


Zihin paylaşımı Nerede 'getImei () "yöntemi için referans bulabilirim?
sam byte


android 10 için çözüm nedir?
Amin Pinjari

1
Güvenlik nedeniyle Maalesef Android 10'da üçüncü taraf uygulamaların Android 10'daki gizlilik değişiklikleri hakkında daha fazla bilgi için IMEI gibi Donanım tanımlayıcılarını alması artık kısıtlanmıştır. Developer.android.com/about/versions/10/privacy
Muhammad Hamza Shahid

Android Oreo'da çalışır.
Satish Shetty

10

TelephonyManager'ın getDeviceId () yöntemi benzersiz aygıt kimliğini döndürür; örneğin, GSM için IMEI ve CDMA telefonlar için MEID veya ESN. Aygıt kimliği yoksa null değerini döndürün.

Java Kodu

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> 

İzin Gerekli manifest dosyasında READ_PHONE_STATE.


4

Benzersiz Telefon Kimliği almak için bu TelephonyManager TELEPHONY_SERVICE işlevini kullanabilirsiniz , İzin Gerekiyor: READ_PHONE_STATE

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

Örneğin, GSM için IMEI ve CDMA telefonlar için MEID veya 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();
}

Aygıt kimliği yoksa null değerini döndürün .


ve neden cihaz kimliği boş? çünkü köklü cihaz.
Vishal Sojitra

android 10 için çözüm nedir?
Amin Pinjari


3

Bunu deneyin (her zaman ilk IMEI'yi almanız gerekir)

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


2

Aşağıdaki kodu kullanmanız size IMEI numarası verir:

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

1

API Seviye 11 veya üstü için:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

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

1

Tüm android sürümleri için izin ve karşılaştırılabilirlik kontrolü ile DeviceId (IMEI) almak için Kotlin Kodu:

 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

    }

Ayrıca bu izni AndroidManifest.xml dosyasına ekleyin:

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

1

AndroidManifest.xml dosyasında aşağıdaki izne ihtiyacınız olacak:

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

Almak için IMEI (Uluslararası Mobil Cihaz Kimliği) ve O API düzeyinde 26 üzerindeyse o zaman olsun telephonyManager.getImei()boş şekilde bunun için, kullandığımız ANDROID_ID bir benzersiz tanıtıcı olarak.

 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 versiyonunu arayanlar için böyle bir şey kullanabilirsiniz;

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

NOT: checkSelfPermission veya kullandığınız herhangi bir yöntemi telephonyService()kullanarak bir izin denetimi ile yukarı kaydırmalısınız .

Ayrıca bu izni bildirim dosyasına ekleyin;

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

0

aşağıdaki kodu kullanın:

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

Ve aşağıdaki kodu onRequestPermissionsResult yöntemini çağırın:

@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 dosyasına aşağıdaki izni ekleyin:

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

0

Android 10 için Aşağıdaki kod benim için çalışıyor.

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
                }
            }
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.