基于Flutter获取Android Management API注册设备的enrolmentToken/QR码详情
在Flutter中获取全托管设备的注册令牌(EnrolmentToken)详情
核心方案
要拿到设备注册时用的EnrolmentToken或QR码详情,最可靠的方式是通过你的后端服务器调用Android Management API查询设备信息,避免在Flutter端直接暴露API密钥。同时可以结合设备端的唯一标识(如IMEI)来匹配目标设备。
具体实现步骤
1. Flutter端获取设备唯一标识
先拿到设备的IMEI(或序列号、Android ID),用来在后端匹配Android Management API中的设备记录。推荐用device_info_plus插件:
import 'package:device_info_plus/device_info_plus.dart'; Future<String?> getDeviceIdentifier() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; // 全托管设备下可获取IMEI(需申请READ_PHONE_STATE权限) if (androidInfo.imei != null) { return androidInfo.imei; } // 备选:设备序列号 return androidInfo.serialNumber; }
注意:在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Android 10+ 下,全托管设备作为设备所有者,自动拥有该权限,无需用户授权。
2. 后端服务器调用Android Management API查询
在你的后端实现接口,接收Flutter传来的设备标识,调用Android Management API的enterprises.devices.list接口过滤设备:
接口调用逻辑(以Node.js为例)
const {google} = require('googleapis'); const androidmanagement = google.androidmanagement('v1'); async function getDeviceEnrolmentToken(enterpriseId, deviceImei) { const auth = new google.auth.GoogleAuth({ keyFile: 'service-account-key.json', // 你的服务账号密钥 scopes: ['https://www.googleapis.com/auth/androidmanagement'], }); const res = await androidmanagement.enterprises.devices.list({ auth: auth, parent: `enterprises/${enterpriseId}`, filter: `imei:"${deviceImei}"`, // 用IMEI过滤设备 }); if (res.data.devices && res.data.devices.length > 0) { const device = res.data.devices[0]; // 返回注册令牌及相关详情 return { enrolmentToken: device.enrolmentToken, qrCodeDetails: device.initialEnrolmentToken?.qrCode, // 如果QR码信息存在 deviceId: device.name.split('/').pop(), }; } return null; }
3. Flutter端上报标识并接收结果
Flutter通过HTTP请求把设备标识发给后端,拿到返回的EnrolmentToken详情后,再上报到你的业务数据库:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<Map<String, dynamic>?> fetchEnrolmentDetails(String deviceId) async { try { final response = await http.post( Uri.parse('https://your-backend-api.com/get-enrolment-details'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'deviceIdentifier': deviceId}), ); if (response.statusCode == 200) { return jsonDecode(response.body); } else { print('请求失败,状态码:${response.statusCode}'); } } catch (e) { print('网络错误:$e'); } return null; } // 调用示例 void updateDatabase() async { String? deviceId = await getDeviceIdentifier(); if (deviceId != null) { Map<String, dynamic>? enrolmentData = await fetchEnrolmentDetails(deviceId); if (enrolmentData != null) { // 上报到你的业务数据库 print('拿到注册令牌:${enrolmentData['enrolmentToken']}'); // 这里写更新数据库的逻辑 } } }
关键注意事项
- API安全:绝对不要在Flutter端直接调用Android Management API,必须通过后端中转,防止泄露服务账号密钥。
- 标识备选方案:如果IMEI无法获取,可使用设备序列号或Android ID,确保能唯一匹配到目标设备。
- 令牌生命周期:部分EnrolmentToken是一次性的,但注册完成后,设备会永久关联该令牌,通过API查询设备信息就能拿到对应的令牌记录。
内容的提问来源于stack exchange,提问作者Gautam Bhateja
相关产品推荐
相关产品推荐

