You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:10:29