Androidはセキュリティに真剣であり、新しいAndroidバージョンをより安全にすることを試みているため、開発者が新しいセキュリティ機能を最新の状態に保ち、古い方法の代替策を見つけてアプリと互換性を持たせることは困難になっています古い機能。
この質問は新しいAndroid 10のIMEIについてです!古い方法は、以下のコードを使用してIMEI番号を取得するのが非常に簡単でした
String deviceId = "";
if (Build.VERSION.SDK_INT >= 26) {
if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
deviceId = telMgr.getMeid();
} else if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
deviceId = telMgr.getImei();
} else {
deviceId = ""; // default!!!
}
} else {
deviceId = telMgr.getDeviceId();
}
New Android 10では、IMEI番号の取得が制限されています。 Androidドキュメントによると
iMEIとシリアル番号の両方を含むデバイスのリセットできない識別子にアクセスするには、アプリにREAD_PRIVILEGED_PHONE_STATE特権権限が必要です。
問題は、ランタイム権限を
Android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
私のコンパイラはこの権限を認識せず、この行でエラーが発生しましたが、マニフェストファイルでこの権限を要求すると、この行は認識されますが、この権限はシステムアプリ専用であるという警告が表示されます。
アプリをAndroid 10に対応させ、IMEIを取得したい。デバイスの所有者またはプロファイルの所有者にならずに、Android 10でIMEI番号を取得するにはどうすればよいですか?
一意の識別子を取得するには、FirebaseInstanceId.getInstance().getId();
またはString uniqueID = UUID.randomUUID().toString();
を使用できます。ベストプラクティスについては、こちらをご覧ください https://developer.Android.com/training/articles/user-data-ids#Java
Android 10でIMEI番号へのアクセスが制限されています。
ソフトウェアIDを取得することで、代替ソリューションを利用できます。ソフトウェアIDを一意のIDとして使用できます。アプリケーションで使用するコードを以下に示します。
public static String getDeviceId(Context context) {
String deviceId;
if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
deviceId = Settings.Secure.getString(context.getContentResolver(),Settings.Secure.Android_ID);
}else {
final TelephonyManager mTelephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
deviceId = mTelephony.getDeviceId();
} else {
deviceId = Settings.Secure.getString(
context.getContentResolver(),
Settings.Secure.Android_ID);
}
}
return deviceId;
}