Вы хотите вызвать android.telephony.TelephonyManager.getDeviceId()
.
Это вернет любую строку, однозначно идентифицирующую устройство (IMEI в GSM, MEID для CDMA).
] Для этого вам понадобятся следующие разрешения в вашем AndroidManifest.xml
:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
.
Сказав это, будьте осторожны об этом.
Обновление: Как уже упоминалось в комментариях ниже, это не так, как пользователи могут задаться вопросом, почему ваше приложение обращается к стеклу телефонии, может быть сложно перенести данные. безопасный способ аутентификации пользователей, а также проблемы конфиденциальности. Это не рекомендуется. Вместо этого посмотрите API входа в Google+ , если вы хотите внедрить систему входа без трения.
Android Backup API также доступен, если вы просто хотите легкий способ сохранить набор строк, когда пользователь сбрасывает свой телефон (или покупает новое устройство).
Вы можете использовать эту функцию TelephonyManager TELEPHONY_SERVICE для получения уникального идентификатора устройства, требуется разрешение: READ_PHONE_STATE
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Пример: телефоны TELEPHONY_SERVICE и MEID или ESN для 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();
}
MEID или ESN для CDMA , если идентификатор устройства недоступен.
Для 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);
}
}
Надеюсь, это поможет вам или кому-то.
От: 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.
Или вы можете использовать параметр ANDROID_ID из Android.Provider.Settings.System (как описано здесь strazerre.com).
Это имеет то преимущество, что оно не требует специальных разрешений, но может измениться, если
Для ссылки здесь приведен код из блога:
import android.provider.Settings;
import android.provider.Settings.System;
String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);
Замечание по реализации: if идентификатор имеет решающее значение для архитектуры системы, вам нужно знать, что на практике некоторые из самых низких телефонов Android и amp; были найдены таблички с повторным использованием того же ANDROID_ID (9774d56d682e549c - это значение, отображаемое в наших журналах)
String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
– Matthias
28 April 2016 в 18:48
Новое обновление:
Для Android версии 6 и выше, MAC-адрес WLAN устарел, следуйте за ответом Тревора Джонса
Новое обновление:
Для уникальной идентификации устройств вы можете использовать Secure.ANDROID_ID.
Новое обновление:
Новое обновление :
IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используют Simcard. В Dual sim устройствах мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard.Вы можете использовать строку MAC-адреса WLAN (не рекомендуется для Marshmallow и Marshmallow +, поскольку MAC-адрес WLAN устарел на Marshmallow вперед, поэтому вы получите фиктивное значение)
We может получить уникальный идентификатор для телефонов android, используя MAC-адрес WLAN. MAC-адрес уникален для всех устройств и работает для всех типов устройств.
Вы можете использовать строку MAC-адреса WLAN (не рекомендуется для Marshmallow и Marshmallow +, поскольку MAC-адрес WLAN устарел на
IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используйте Simcard. В Dual sim-устройствах мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard. Он остается уникальным, если приложение переустановленоНедостатки использования MAC-адреса WLAN в качестве идентификатора устройства :
Он остается уникальным, если приложение переустановленоОно остается уникальным, если приложение переустановлено
Если устройство не у вас есть wifi-оборудование, тогда вы получите нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют wifi-аппаратное обеспечение, и на рынке почти нет устройств без оборудования Wi-Fi.
Как и в 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», чтобы использовать выше код.
Я использую следующий код, чтобы получить 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;
}
В дополнение к ответу Тревора Джонса вы можете использовать его следующим образом:
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();
И вы должны добавить в свой файл Manifest.xml следующее разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
В эмуляторе вы, вероятно, получите значение «00000 ...». getDeviceId () возвращает NULL, если идентификатор устройства недоступен.
Метод getDeviceId () TelephonyManager возвращает уникальный идентификатор устройства, например IMEI для GSM и MEID или ESN для телефонов CDMA. Возвращает null, если идентификатор устройства недоступен.
Код Java
package com.AndroidTelephonyManager;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;
public class AndroidTelephonyManager extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textDeviceID = (TextView)findViewById(R.id.deviceid);
//retrieve a reference to an instance of TelephonyManager
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(telephonyManager));
}
String getDeviceID(TelephonyManager phonyManager){
String id = phonyManager.getDeviceId();
if (id == null){
id = "not available";
}
int phoneType = phonyManager.getPhoneType();
switch(phoneType){
case TelephonyManager.PHONE_TYPE_NONE:
return "NONE: " + id;
case TelephonyManager.PHONE_TYPE_GSM:
return "GSM: IMEI=" + id;
case TelephonyManager.PHONE_TYPE_CDMA:
return "CDMA: MEID/ESN=" + id;
/*
* for API Level 11 or above
* case TelephonyManager.PHONE_TYPE_SIP:
* return "SIP";
*/
default:
return "UNKNOWN: ID=" + id;
}
}
}
Код Java
<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 в файле манифеста.
для уровня API 11 или выше:
case TelephonyManager.PHONE_TYPE_SIP:
return "SIP";
TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));
Метод getDeviceId () устарел. Там новый метод для этого getImei (int)
. Проверьте здесь
, чтобы получить IMEI (международный идентификатор мобильного оборудования)
public String getIMEI(Activity activity) {
TelephonyManager telephonyManager = (TelephonyManager) activity
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDeviceId();
}
, чтобы получить IMEI
public String getDeviceUniqueID(Activity activity){
String device_unique_id = Secure.getString(activity.getContentResolver(),
Secure.ANDROID_ID);
return device_unique_id;
}