如何在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
相关产品推荐
相关产品推荐

