안드로이드에서 장치의 IMEI/ESN을 프로그래밍 방식으로 가져오는 방법은 무엇입니까?
각 장치를 고유하게 식별하려면 IMEI(또는 CDMA 장치의 ESN 번호)를 사용합니다.프로그래밍 방식으로 액세스하는 방법은 무엇입니까?
전화하고 싶으실 겁니다.
이렇게 하면 장치를 고유하게 식별하는 문자열(GSM의 IMEI, CDMA의 MEID)이 반환됩니다.
에서 과 같은 AndroidManifest.xml
:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
그러기 위해서는
그렇긴 하지만, 이것을 하는 것은 조심해야 합니다.사용자는 애플리케이션이 자신의 전화 스택에 액세스하는 이유를 궁금해할 뿐만 아니라, 새 장치가 있으면 데이터를 마이그레이션하기가 어려울 수 있습니다.
업데이트: 아래 설명에서 언급한 것처럼 이 방법은 사용자를 안전하게 인증하는 방법이 아니며 개인 정보 보호 문제가 발생합니다.권장되지 않습니다.대신 마찰 없는 로그인 시스템을 구현하고 싶다면 Google+ 로그인 API를 확인하십시오.
Android Backup API는 사용자가 전화기를 재설정하거나 새 장치를 구입할 때 문자열 번들을 유지하는 간단한 방법을 원하는 경우에도 사용할 수 있습니다.
Trevor Jones의 답변 외에도 다음과 같이 사용할 수 있습니다.
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();
그리고 다음 권한을 Manifest.xml 파일에 추가해야 합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
에뮬레이터에서는 "00000..."과 같은 결과를 얻을 수 있습니다.값어치가getDeviceId()는 디바이스 ID를 사용할 수 없는 경우 NULL을 반환합니다.
IMEI를 가져오거나 Secure를 사용하기 위해 다음 코드를 사용합니다.안드로이드_단말기에 전화 기능이 없는 경우 대신 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;
}
또는 Android_를 사용할 수 있습니다.Android에서 ID 설정.공급자.설정.시스템(strazerre.com 에 설명되어 있음).
이것은 특별한 권한이 필요하지 않지만 다른 응용 프로그램이 쓰기 액세스 권한을 가지고 있고 변경하는 경우 변경될 수 있다는 장점이 있습니다(이는 보기에는 드물지만 불가능하지는 않습니다).
참고로 블로그의 코드는 다음과 같습니다.
import android.provider.Settings;
import android.provider.Settings.System;
String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);
구현 참고: ID가 시스템 아키텍처에 중요한 경우, 실제로는 일부 저가형 Android 전화기와 태블릿이 동일한 Android_를 재사용하고 있음을 알아야 합니다.ID(9774d56d682e549c는 로그에 표시되는 값이었습니다.)
보낸 사람: 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 매니페스트에 필요한 권한:
android.permission.READ_PHONE_STATE
참고: 휴대폰 IMEI 역할을 할 수 없는 태블릿이나 기기의 경우에는 Null이 됩니다.
IMEI(국제 모바일 장비 식별자)를 획득합니다.
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;
}
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);
}
}
이것이 당신이나 누군가에게 도움이 되기를 바랍니다.
26 26과 같이 사용할 수 .getDeviceId()
하여 API 및 이전 할 수 .
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와 같은 재설정 불가능한 하드웨어 식별자를 가져오는 것이 제한됩니다.
새 업데이트:
Android 버전 6 이상의 경우 WLAN MAC 주소가 더 이상 사용되지 않습니다. Trevor Johns의 답변을 따르십시오.
업데이트:
장치의 고유 식별을 위해 보안을 사용할 수 있습니다.안드로이드_신분증.
이전 답변:
IMEI를 고유 장치 ID로 사용할 경우의 단점:
- IMEI는 장치의 심카드 슬롯에 의존하므로 심카드를 사용하지 않는 장치의 IMEI를 가져올 수 없습니다.듀얼 심 장치에서는 심 카드용 슬롯이 2개이므로 동일한 장치에 대해 2개의 서로 다른 IMEI를 얻습니다.
WLAN MAC 주소가 마시멜로에서 사용되지 않으므로 WLAN MAC 주소 문자열(Mashmallow 및 Mashmallow+에 권장되지 않음)을 사용할 수 있습니다.따라서 가짜 값을 얻게 됩니다.)
WLAN MAC 주소를 사용하여 Android 전화기의 Unique ID도 마찬가지입니다.MAC 주소는 모든 장치에서 고유하며 모든 종류의 장치에서 작동합니다.
WLAN MAC 주소를 장치 ID로 사용할 경우의 이점:
모든 유형의 장치(스마트폰 및 태블릿)에 대한 고유 식별자입니다.
응용 프로그램이 다시 설치된 경우에도 고유하게 유지됩니다.
WLAN MAC 주소를 장치 ID로 사용할 경우의 단점:
마시멜로 이상의 가짜 값을 드립니다.
장치에 wifi 하드웨어가 없으면 null MAC 주소가 표시되지만 일반적으로 대부분의 Android 장치에 wifi 하드웨어가 있고 시장에 wifi 하드웨어가 없는 장치가 거의 없습니다.
출처: technetexperts.com
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>
권한 필요 읽기_매니페스트 파일에 PHONE_STATE가 있습니다.
이 TelephonyManager TElephony_SERVICE 함수를 사용하여 고유한 장치 ID, 사용 권한 필요: READ_를 가져올 수 있습니다.전화_상태
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
예를 들어, GSM의 경우 IMEI, CDMA 전화의 경우 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();
}
장치 ID를 사용할 수 없는 경우 null을 반환합니다.
사용해 보십시오(항상 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();
}
아래 코드를 사용하면 IMEI 번호가 제공됩니다.
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());
방법getDeviceId()
사용되지 않습니다.이를 위한 새로운 방법이 있습니다.getImei(int)
AndroidManifest.xml에서 다음 권한이 필요합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
IMEI(국제 모바일 장비 식별자)를 얻고 API 레벨 26 이상이면 다음과 같습니다.telephonyManager.getImei()
늘 그렇듯, 우리는 안드로이드_를 사용합니다.고유 식별자로서의 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;
}
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
}
}
}
API 레벨 11 이상의 경우:
case TelephonyManager.PHONE_TYPE_SIP:
return "SIP";
TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));
모든 안드로이드 버전에 대한 취급 권한 및 비교 가능성 검사와 함께 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-->
아래 코드 사용:
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();
}
}
다음 코드에 따라 RequestPermissionsResult 메서드를 호출합니다.
@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" />
재설정할 수 없는 장치 식별자에 대한 제한
Android 10부터는 앱에 다음 기능이 있어야 합니다.READ_PRIVILEGED_PHONE_STATE
IMEI와 일련 번호를 모두 포함하는 장치의 재설정 불가능한 식별자에 액세스하기 위한 권한입니다.
코틀린 버전을 찾는 사람들은 다음과 같은 것을 사용할 수 있습니다.
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")
}
참고: 포장해야 합니다.telephonyService()
위에서 checkSelfPermission 또는 사용하는 방법을 사용하여 권한 검사를 수행합니다.
또한 매니페스트 파일에 이 권한을 추가합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
당신이 id 10+ 또는 29+ 모바일에서 imei 번호를 얻을 수 있는 방법은 없습니다. 여기서 장치의 imei 번호를 만드는 데 사용될 대체 기능입니다.
public static String getDeviceID(){
String devIDShort = "35" + //we make this look like a valid IMEI
Build.BOARD.length()%10+ Build.BRAND.length()%10 +
Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 + Build.TYPE.length()%10 +
Build.USER.length()%10 ; //13 digits
return devIDShort;
}
언급URL : https://stackoverflow.com/questions/1972381/how-to-get-the-devices-imei-esn-programmatically-in-android
'programing' 카테고리의 다른 글
주 스레드 체커: 백그라운드 스레드에서 호출된 UI API: -[UIApplicationapplicationState] (0) | 2023.08.04 |
---|---|
'key: value'마다 한 줄씩 사용하여 CSV 파일에 사전 쓰기 (0) | 2023.08.04 |
MariaDB - 'AS'로 생성된 열의 기본값은 1024입니다. (0) | 2023.08.04 |
데이터베이스 1:1 관계를 사용하는 것이 타당한 시기가 있습니까? (0) | 2023.08.04 |
Angular2 *ngIf 템플릿에서 객체 배열 길이 확인 (0) | 2023.08.04 |