Bagaimana cara mendapatkan IMEI / ESN perangkat secara terprogram di android?

343

Untuk mengidentifikasi setiap perangkat secara unik, saya ingin menggunakan IMEI (atau nomor ESN untuk perangkat CDMA). Bagaimana cara mengakses ini secara terprogram?

Tom
sumber
Untuk mendapatkan IMEI untuk kedua SIM di Ponsel dual SIM gunakan refleksi Java. Lihat di sini adalah demo
Vaibhav Jani
5
@PiedPiper: IMEI tidak spesifik SIM. Anda sedang berpikir IMSI.
Phillip
@Phillip Terima kasih sobat. Saya telah memperbarui jawaban saya :)
Vaibhav Jani
1
Semuanya .. apakah ada beberapa perubahan di Android 6? apakah kita masih dapat mengakses IMEI dengan beberapa cara?
therealprashant
1
Anda perlu meminta Izin READ_PHONE_STATE saat runtime, maka Anda masih bisa mendapatkan IMEI
Flo We

Jawaban:

387

Anda ingin menelepon android.telephony.TelephonyManager.getDeviceId().

Ini akan mengembalikan string apa pun yang secara unik mengidentifikasi perangkat (IMEI pada GSM, MEID untuk CDMA).

Anda memerlukan izin berikut di AndroidManifest.xml:

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

untuk melakukan ini.

Karena itu, berhati-hatilah dalam melakukan ini. Pengguna tidak hanya akan bertanya-tanya mengapa aplikasi Anda mengakses tumpukan telepon mereka, mungkin akan sulit untuk memigrasikan data jika pengguna mendapatkan perangkat baru.

Pembaruan: Seperti disebutkan dalam komentar di bawah, ini bukan cara aman untuk mengotentikasi pengguna, dan meningkatkan masalah privasi. Tidak disarankan. Sebagai gantinya, lihat API Login Google+ jika Anda ingin menerapkan sistem login tanpa gesekan.

The API Backup Android juga tersedia jika Anda hanya ingin cara ringan untuk bertahan bundel string ketika pengguna me-reset telepon mereka (atau membeli perangkat baru).

Trevor Johns
sumber
1
Apa yang akan menjadi solusi yang lebih baik yang memungkinkan mereka untuk memigrasikan data di masa depan? Alamat email Google? Jika demikian, bagaimana saya bisa mengeluarkannya dari sistem?
Tom
3
Cara paling andal untuk melakukan ini adalah meminta mereka membuat akun saat pertama kali meluncurkan aplikasi Anda. Ada beberapa cara untuk mendapatkan alamat email pengguna (lihat dokumen di AccountManager), tetapi memverifikasi bahwa pengguna jahat tidak memalsukan informasi ini memerlukan sedikit pengetahuan tentang cara kerja API Data Google - lebih dari yang bisa saya taruh di ini kotak komentar kecil. ;)
Trevor Johns
1
Sebenarnya, dalam hal ini, Anda tidak memiliki jaminan bahwa pengguna juga tidak memalsukan IMEI / MEID mereka. Jika keamanan menjadi masalah, Anda benar-benar perlu menggunakan nama pengguna / kata sandi, atau metode getAuthToken () di AccountManager (dan sekali lagi, Anda harus memverifikasi token ini dengan server yang awalnya mengeluarkannya).
Trevor Johns
2
Adi: Kode untuk mendapatkan ID perangkat? Tidak ada yang lebih dari satu metode + izin yang saya sebutkan di atas. Yang mengatakan, Anda harus melihat ke dalam API Login Google+, itulah pendekatan yang disarankan untuk mengotentikasi pengguna hari ini: developer.android.com/google/play-services/auth.html
Trevor Johns
2
Apakah ini menjalankan Android 6? Dan apakah Anda menargetkan SDK 23? Maka Anda perlu meminta READ_PHONE_STATE saat runtime sebelum menanyakan IMEI
Flo We
284

Selain jawaban Trevor Johns, Anda dapat menggunakan ini sebagai berikut:

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

Dan Anda harus menambahkan izin berikut ke file Manifest.xml Anda:

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

Dalam emulator, Anda mungkin akan mendapatkan nilai "00000 ...". getDeviceId () mengembalikan NULL jika ID perangkat tidak tersedia.

Taner
sumber
1
Apakah ada cara untuk mendapatkan emulator untuk mengembalikan nomor IMEI?
MikeSchem
@MikeSchem, emulator tidak memiliki string IMEI yang berarti.
shizhen
Coba jangan gunakan: <menggunakan-izin android: name = "android.permission.READ_PHONE_STATE" /> izin ini sangat sensitif, Anda bisa mendapatkan App Rejected dari Google Play Team (aturan keamanan baru ditambahkan pada akhir tahun2018). Sebagai saran lebih baik gunakan ID Iklan.
Duna
@Taner Akankah itu berfungsi pada perangkat Dual sim? (Perlu mendapatkan IMEI Pertama saja)
Arnold Brown
Apakah ada masalah keamanan untuk menggunakan READ_PHONE_STATEizin?
viper
62

Saya menggunakan kode berikut untuk mendapatkan IMEI atau menggunakan Secure.ANDROID_ID sebagai alternatif, ketika perangkat tidak memiliki kemampuan telepon:

/**
 * 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;
}
Asaf Pinhassi
sumber
17
TextUtils.isEmpty () -> if (identifier == null || identifier .length () == 0)
Mikhaili
2
Hai Pinhassi, Apakah Anda memiliki kasus ketika ID perangkat yang dikembalikan oleh manajer telepon nol atau kosong, tetapi nilainya dibaca dari Secure.ANDROID_ID tidak kosong? Terima kasih
Budda
4
Sejauh yang saya ingat itu untuk tablet tanpa kartu SIM (tapi saya tidak yakin 100%).
Asaf Pinhassi
Secure.ANDROID_ID berubah jika Perangkat diformat atau rom disetel ulang oleh pabrik
shridutt kothari
Nexus7 (1stGen) saya kembali nulluntuk perangkat teleponId ... Adakah yang tahu cara mendapatkan IMEI dari tablet?
Sakiboy
38

Atau Anda dapat menggunakan pengaturan ANDROID_ID dari Android.Provider.Settings.System (seperti dijelaskan di sini strazerre.com ).

Ini memiliki keuntungan karena tidak memerlukan izin khusus tetapi dapat berubah jika aplikasi lain memiliki akses tulis dan mengubahnya (yang tampaknya tidak biasa tetapi bukan tidak mungkin).

Hanya untuk referensi di sini adalah kode dari blog:

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

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

Catatan implementasi : jika ID sangat penting untuk arsitektur sistem Anda perlu menyadari bahwa dalam praktiknya beberapa ponsel & tablet Android sangat rendah telah ditemukan menggunakan kembali ANDROID_ID yang sama (9774d56d682e549c adalah nilai yang muncul di log kami)

ton
sumber
15
Konstanta ini sudah usang. Anda malah perlu menggunakan android.provider.Settings.Secure.ANDROID_ID;
mcorley
@mcorley ketika saya menggunakan android.provider.Settings.Secure.ANDROID_ID untuk tablet nexus 7 dan nexus 4 mengembalikan nilai yang sama 'android_id'
vuhung3990
3
@meowmeo melakukan hal yang sama untuk saya, sampai saya menggunakan kode yang sekarang menjadi bagian dari jawaban (ish). String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Matthias
Tapi bukankah ini akan disetel ulang ke ANDROID_ID baru setelah reset pabrik? Bagaimana jika saya membutuhkan ANDROID_ID persisten yang dapat selamat dari reset.
IgorGanapolsky
35

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

Kode berikut membantu dalam mendapatkan nomor IMEI perangkat android:

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

Izin yang diperlukan dalam Android Manifest:

android.permission.READ_PHONE_STATE

CATATAN: Dalam hal tablet atau perangkat yang tidak dapat bertindak sebagai IMEI Ponsel akan menjadi nol.

ahli alkimia
sumber
1
ini adalah kode aktual yang saya temukan untuk mendapatkan IMEI
Anand Savjani
2
Sayangnya, dengan Marshmallow maju Anda sekarang harus meminta izin ini saat runtime. Izin ini tidak ideal, karena mengganggu pengalaman pengguna, dan dapat membuat beberapa pengguna curiga.
IgorGanapolsky
Coba jangan gunakan: <menggunakan-izin android: name = "android.permission.READ_PHONE_STATE" /> izin ini sangat sensitif, Anda bisa mendapatkan App Rejected dari Google Play Team (aturan keamanan baru ditambahkan pada akhir 2018). Sebagai saran, lebih baik gunakan ID Periklanan sebagai gantinya IMEI
Duna
apa solusi untuk android 10?
Amin Pinjari
23

untuk mendapatkan IMEI (pengidentifikasi peralatan seluler internasional)

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

untuk mendapatkan id unik perangkat

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}
Zin Win Htet
sumber
2
Menampilkan alternatif device_unique_id sangat membantu
JoeGalind
20

Untuk Android 6.0+ permainan telah berubah jadi saya sarankan Anda menggunakan ini;

Cara terbaik untuk pergi adalah selama runtime kalau tidak Anda mendapatkan kesalahan izin.

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

Semoga ini bisa membantu Anda atau seseorang.

Orang Mati
sumber
16

Pembaruan Baru:

Untuk Android Versi 6 Dan Di Atas, Alamat MAC WLAN telah ditinggalkan, ikuti jawaban Trevor Johns

Memperbarui:

Untuk Identifikasi unik perangkat, Anda dapat Menggunakan Secure.ANDROID_ID .

Jawaban lama:

Kerugian menggunakan IMEI sebagai Device ID Unik:

  • IMEI tergantung pada slot Simcard perangkat, sehingga IMEI tidak mungkin untuk perangkat yang tidak menggunakan Simcard. Dalam perangkat dual sim, kami mendapatkan 2 IMEI berbeda untuk perangkat yang sama karena memiliki 2 slot untuk kartu sim.

Anda dapat menggunakan string Alamat MAC WLAN (Tidak Disarankan Untuk Marshmallow dan Marshmallow + karena Alamat MAC WLAN sudah tidak digunakan lagi di Marshmallow. Jadi Anda akan mendapatkan nilai palsu)

Kita bisa mendapatkan ID Unik untuk ponsel android menggunakan alamat MAC WLAN juga. Alamat MAC unik untuk semua perangkat dan berfungsi untuk semua jenis perangkat.

Keuntungan menggunakan alamat MAC WLAN sebagai Device ID:

  • Ini adalah pengidentifikasi unik untuk semua jenis perangkat (ponsel pintar dan tablet).

  • Tetap unik jika aplikasi diinstal ulang

Kerugian menggunakan alamat MAC WLAN sebagai Device ID:

  • Berikan Anda Nilai Besar dari Marshmallow dan di atasnya.

  • Jika perangkat tidak memiliki perangkat wifi, maka Anda mendapatkan alamat MAC nol, tetapi secara umum terlihat bahwa sebagian besar perangkat Android memiliki perangkat wifi dan hampir tidak ada perangkat di pasar tanpa perangkat wifi.

SUMBER: technetexperts.com

Jamil
sumber
7
"IMEI tergantung pada Simcard" ... Ini salah. Anda tampaknya membingungkan IMEI dengan nomor IMSI
Merlevede
2
Identitas Peralatan Mobile Station Internasional atau IMEI adalah nomor yang mengidentifikasi ponsel yang berjalan pada jaringan GSM. Saya secara pribadi telah mencobanya dan itu memberi saya nol secara terprogram jika tidak ada operator nirkabel di Telepon GSM. smartmobilephonesolutions.com/content/…
Jamil
3
Anda benar, saya tidak membaca dengan cermat. IMEI dikaitkan dengan transceiver kartu SIM, bukan ke kartu SIM. Salahku!
Merlevede
2
Alamat MAC WLAN telah ditinggalkan pada Marshmallow maju. Jadi, Anda akan mendapatkan nilai palsu!
IgorGanapolsky
1
android 6 jangan mengembalikan Alamat MAC WIFI yang benar dengan kode Anda. Perhatikan itu.
zszen
15

Seperti dalam API 26 getDeviceId()disusutkan sehingga Anda dapat menggunakan kode berikut untuk memenuhi API 26 dan versi sebelumnya

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

Jangan lupa untuk menambahkan permintaan izin untuk READ_PHONE_STATEmenggunakan kode di atas.

PEMBARUAN: Dari Android 10, ini dibatasi untuk aplikasi pengguna untuk mendapatkan pengidentifikasi perangkat keras yang tidak dapat direset seperti IMEI.

Muhammad Hamza Shahid
sumber
Berbagi pikiran di mana saya dapat menemukan referensi untuk metode 'getImei () "?
sam byte
2
Tentu silakan gunakan developer.android.com/reference/android/telephony/... untuk referensi getImei ()
Muhammad Hamza Shahid
apa solusi untuk android 10?
Amin Pinjari
1
Sayangnya Amin di Android 10 karena alasan keamanan sekarang dibatasi untuk aplikasi pihak ketiga untuk mendapatkan pengidentifikasi Perangkat Keras seperti IMEI untuk info lebih lanjut tentang perubahan privasi di Android 10 kunjungi developer.android.com/about/versions/10/privacy
Muhammad Hamza Shahid
Bekerja di Android Oreo.
Satish Shetty
10

Metode getDeviceId () dari TelephonyManager mengembalikan ID perangkat unik, misalnya, IMEI untuk GSM dan MEID atau ESN untuk telepon CDMA. Kembalikan nol jika ID perangkat tidak tersedia.

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

Diperlukan Izin READ_PHONE_STATE dalam file manifes.


sumber
4

Anda dapat menggunakan fungsi TELEPHONY_SERVICE TelephonyManager ini untuk mendapatkan ID perangkat yang unik , Membutuhkan Izin: READ_PHONE_STATE

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

Contoh, IMEI untuk GSM dan MEID atau ESN untuk telepon CDMA .

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

Kembalikan nol jika ID perangkat tidak tersedia .

A-Droid Tech
sumber
dan mengapa perangkat Id null? karena perangkat yang di-rooting.
Vishal Sojitra
apa solusi untuk android 10?
Amin Pinjari
3

Metode getDeviceId()ini sudah usang. Ada metode baru untuk inigetImei(int)

Periksa di sini

Waran-
sumber
apa solusi untuk android 10?
Amin Pinjari
3

Coba ini (selalu perlu IMEI dulu)

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();
        }
Arnold Brown
sumber
apa solusi untuk android 10? developer.android.com/about/versions/10/privacy
Amin Pinjari
2

Gunakan kode di bawah ini memberi Anda nomor IMEI:

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

untuk API Level 11 atau lebih tinggi:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));
Anil MH
sumber
1

Kode Kotlin untuk mendapatkan DeviceId (IMEI) dengan izin penanganan & pemeriksaan komparatif untuk semua versi android:

 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

    }

Tambahkan juga izin ini ke AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- IMEI-->
Hamed Jaliliani
sumber
1

Anda memerlukan izin berikut di AndroidManifest.xml Anda:

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

Untuk mendapatkan IMEI (pengenal peralatan seluler internasional) dan jika itu di atas API level 26 maka kami mendapatkan telephonyManager.getImei()sebagai null sehingga untuk itu, kami menggunakan ANDROID_ID sebagai Pengidentifikasi Unik.

 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;
    }
Rahul
sumber
0

Bagi mereka yang mencari versi Kotlin, Anda dapat menggunakan sesuatu seperti ini;

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

CATATAN: Anda harus membungkus di telephonyService()atas dengan pemeriksaan izin menggunakan checkSelfPermission atau metode apa pun yang Anda gunakan.

Juga tambahkan izin ini dalam file manifes;

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

gunakan kode di bawah ini:

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

Dan panggil metodeRequestPermissionsResult kode berikut:

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

Tambahkan izin berikut di AndroidManifest.xml Anda:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Faxriddin Abdullayev
sumber
0

Untuk Android 10 Kode berikut berfungsi untuk saya.

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
                }
            }
        }
Ani
sumber