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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:57:43