Flutter实现谷歌默认手机号选择底部弹窗
实现谷歌默认SIM卡手机号选择底部弹窗(Flutter)
Flutter框架本身没有直接提供调用该系统级手机号选择弹窗的内置API,不过可以通过以下两种方式实现:
1. 原生平台通道(Android)
这个弹窗是Android系统原生的SIM卡选择组件,可通过Flutter的平台通道调用Android原生代码实现:
- 原生Android端:创建方法调用系统的手机号选择Intent
import android.content.Intent import android.os.Bundle import androidx.annotation.NonNull 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.sim_selector/channel" private val REQUEST_CODE = 1001 override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "showSimSelector") { val intent = Intent(android.telecom.TelecomManager.ACTION_CHOOSE_PHONE_ACCOUNT) startActivityForResult(intent, REQUEST_CODE) result.success(true) } else { result.notImplemented() } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { val accountHandle = data?.getParcelableExtra<android.telecom.PhoneAccountHandle>(android.telecom.TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE) val telecomManager = getSystemService(android.telecom.TelecomManager::class.java) val phoneAccount = telecomManager.getPhoneAccount(accountHandle) val phoneNumber = phoneAccount.address?.schemeSpecificPart // 通过通道传回Flutter MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CHANNEL).invokeMethod("onSimSelected", phoneNumber) } } } - Flutter端:通过MethodChannel调用原生方法并接收结果
import 'package:flutter/services.dart'; class SimSelector { static const MethodChannel _channel = MethodChannel('com.example.sim_selector/channel'); static Future<void> showSimSelector() async { _channel.setMethodCallHandler((call) async { if (call.method == 'onSimSelected') { String? phoneNumber = call.arguments as String?; // 处理选中的手机号 print("选中的手机号:$phoneNumber"); } }); await _channel.invokeMethod('showSimSelector'); } }
2. 第三方包简化开发
部分第三方包封装了原生系统的SIM选择逻辑,可直接调用:
sim_card:可获取设备上所有SIM卡的基础信息,若需调用系统弹窗,仍需结合平台通道触发;flutter_sim_selector:部分版本封装了Android系统的SIM选择弹窗调用逻辑,直接调用对应方法即可唤起系统底部弹窗,并获取选中的手机号。
注意:这类系统级弹窗仅支持Android平台,iOS无对应原生组件,需自定义弹窗逻辑。
内容的提问来源于stack exchange,提问作者VipiN Negi
相关产品推荐
相关产品推荐

