Untuk mengidentifikasi setiap perangkat secara unik, saya ingin menggunakan IMEI (atau nomor ESN untuk perangkat CDMA). Bagaimana cara mengakses ini secara terprogram?
Untuk mengidentifikasi setiap perangkat secara unik, saya ingin menggunakan IMEI (atau nomor ESN untuk perangkat CDMA). Bagaimana cara mengakses ini secara terprogram?
Jawaban:
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).
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.
READ_PHONE_STATE
izin?
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;
}
null
untuk perangkat teleponId ... Adakah yang tahu cara mendapatkan IMEI dari tablet?
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)
String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
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.
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;
}
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.
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:
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
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_STATE
menggunakan kode di atas.
PEMBARUAN: Dari Android 10, ini dibatasi untuk aplikasi pengguna untuk mendapatkan pengidentifikasi perangkat keras yang tidak dapat direset seperti IMEI.
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.
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 .
Metode getDeviceId()
ini sudah usang. Ada metode baru untuk inigetImei(int)
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();
}
Gunakan kode di bawah ini memberi Anda nomor IMEI:
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());
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-->
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;
}
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"/>
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" />
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
}
}
}