如何读取 SOTI 管理设备上的 Android 设备 IMEI?
How to read the Android Device IMEI on a SOTI managed device?
我们正在使用 Soti Mobicontrol Managed Android devices in production and since the IMEI access has been restricted after Android 10 I was wondering if Soti agent which has access to the Android Enterprise 功能,可以为我们提供 IMEI,因此我们将其用作设备的唯一 ID。
顺便说一句,公司拥有这些设备,我认为这不是侵犯用户隐私的行为!
我在 Soti Discussion Forum 中找到了一个模糊且不完整的答案,经过多次测试,我终于成功了!!!
当您使用 MobiControl Package Studio 工具为 Android APK 文件创建安装包时,您可以包含 Post-Install Soti Scripts 安装完成后 运行:
其中一个脚本是 sendintent
and, on the other hand, you also have access to some macros 以获取设备信息,即 %IMEI%,或 %DEVICENAME%(宏文档中未列出!)。
这意味着通过定义这样的脚本,您可以在 Soti 托管设备上拥有包含 IMEI 和设备名称的广播消息意图!
sendintent -b "intent:#Intent;action=com.mohsenoid.android.imei.ACTION;S.imei=%IMEI%;S.devicename=%DEVICENAME%;component=com.mohsenoid.android.imei/.ImeiReceiver;end;"
此脚本与此 ADB Shell 命令完全相同:
adb shell am broadcast -a com.mohsenoid.android.imei.ACTION --es imei "SOME\ IMEI" --es devicename "SOME\ DEVICE\ NAME" -n com.mohsenoid.android.imei/.ImeiReceiver
您应用中的 BroadcastReceiver
可能如下所示:
class ImeiReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
intent ?: return
val imei = intent.getStringExtra(IMEI_KEY) ?: return
val deviceName = intent.getStringExtra(DEVICE_NAME_KEY) ?: return
AppSettings.setValue(context, IMEI_KEY, imei)
AppSettings.setValue(context, DEVICE_NAME_KEY, deviceName)
Toast.makeText(context, "Received: IMEI: $imei - DeviceName: $deviceName", Toast.LENGTH_LONG).show()
}
companion object {
const val IMEI_KEY = "imei"
const val DEVICE_NAME_KEY = "devicename"
}
}
不要忘记,您还需要将广播接收器添加到您的 AndroidManifest 文件中,并使用适当的 intent 过滤器和操作。
<receiver
android:name=".ImeiReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.mohsenoid.android.imei.ACTION" />
</intent-filter>
</receiver>
此 GitHub 存储库包含可用于此目的的测试应用程序:
https://github.com/mohsenoid/SOTI-IMEI
我希望这个回答对任何使用此服务的人有所帮助。
我们正在使用 Soti Mobicontrol Managed Android devices in production and since the IMEI access has been restricted after Android 10 I was wondering if Soti agent which has access to the Android Enterprise 功能,可以为我们提供 IMEI,因此我们将其用作设备的唯一 ID。
顺便说一句,公司拥有这些设备,我认为这不是侵犯用户隐私的行为!
我在 Soti Discussion Forum 中找到了一个模糊且不完整的答案,经过多次测试,我终于成功了!!!
当您使用 MobiControl Package Studio 工具为 Android APK 文件创建安装包时,您可以包含 Post-Install Soti Scripts 安装完成后 运行:
其中一个脚本是 sendintent
and, on the other hand, you also have access to some macros 以获取设备信息,即 %IMEI%,或 %DEVICENAME%(宏文档中未列出!)。
这意味着通过定义这样的脚本,您可以在 Soti 托管设备上拥有包含 IMEI 和设备名称的广播消息意图!
sendintent -b "intent:#Intent;action=com.mohsenoid.android.imei.ACTION;S.imei=%IMEI%;S.devicename=%DEVICENAME%;component=com.mohsenoid.android.imei/.ImeiReceiver;end;"
此脚本与此 ADB Shell 命令完全相同:
adb shell am broadcast -a com.mohsenoid.android.imei.ACTION --es imei "SOME\ IMEI" --es devicename "SOME\ DEVICE\ NAME" -n com.mohsenoid.android.imei/.ImeiReceiver
您应用中的 BroadcastReceiver
可能如下所示:
class ImeiReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
intent ?: return
val imei = intent.getStringExtra(IMEI_KEY) ?: return
val deviceName = intent.getStringExtra(DEVICE_NAME_KEY) ?: return
AppSettings.setValue(context, IMEI_KEY, imei)
AppSettings.setValue(context, DEVICE_NAME_KEY, deviceName)
Toast.makeText(context, "Received: IMEI: $imei - DeviceName: $deviceName", Toast.LENGTH_LONG).show()
}
companion object {
const val IMEI_KEY = "imei"
const val DEVICE_NAME_KEY = "devicename"
}
}
不要忘记,您还需要将广播接收器添加到您的 AndroidManifest 文件中,并使用适当的 intent 过滤器和操作。
<receiver
android:name=".ImeiReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.mohsenoid.android.imei.ACTION" />
</intent-filter>
</receiver>
此 GitHub 存储库包含可用于此目的的测试应用程序: https://github.com/mohsenoid/SOTI-IMEI
我希望这个回答对任何使用此服务的人有所帮助。