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

如何在Flutter中使用Dart获取Android手机卡槽1、卡槽2的IMEI号码

前提说明

首先明确Android系统的权限限制:

  • Android 10(API 等级 29)及以上版本,Google已禁止所有普通第三方应用获取IMEI,只有系统签名应用、运营商预装的特权应用可以调用相关接口,普通应用申请权限后也只能获取到空值或者触发权限异常。
  • 以下方案仅适用于Android 9(API 等级 28)及更低版本的系统。
实现步骤

1. 配置权限

在Flutter项目的Android子项目app/src/main/AndroidManifest.xml中添加读取手机状态的权限声明:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Android 6.0及以上版本需要在调用获取接口前,动态向用户申请READ_PHONE_STATE权限,仅静态声明权限无法生效。

2. 实现原生侧与Flutter侧的通信

Flutter没有提供直接获取IMEI的封装接口,需要通过MethodChannel实现Dart与Android原生侧的交互:

Android原生侧(Kotlin示例)

在MainActivity中注册方法通道,实现IMEI获取逻辑:

import android.content.Context
import android.telephony.TelephonyManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example.imei/imei_channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getDualImei") {
                val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                val imeiList = mutableListOf<String?>()
                // 卡槽1 IMEI
                imeiList.add(telephonyManager.getImei(0))
                // 卡槽2 IMEI
                imeiList.add(telephonyManager.getImei(1))
                result.success(imeiList)
            } else {
                result.notImplemented()
            }
        }
    }
}

Flutter Dart侧调用示例

import 'package:flutter/services.dart';

class ImeiUtils {
  static const MethodChannel _channel = MethodChannel('com.example.imei/imei_channel');

  static Future<List<String?>> getDualImei() async {
    try {
      final List<dynamic> result = await _channel.invokeMethod('getDualImei');
      return result.cast<String?>();
    } on PlatformException catch (e) {
      return [null, null];
    }
  }
}

// 调用方式
// List<String?> imeis = await ImeiUtils.getDualImei();
//  imeis[0] 为卡槽1 IMEI,imeis[1] 为卡槽2 IMEI

注意:如果你开发的应用需要上架公域应用商店,不建议使用该方案,Android 10及以上的设备占比已经超过80%,且多数应用商店会对获取IMEI的行为做合规检测,违规调用会被驳回上架申请,建议使用官方推荐的ANDROID_ID等无需特殊权限的唯一标识替代。

内容的提问来源于stack exchange,提问作者test t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:57:02