Flutter手机号码处理插件mobile_number的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter手机号码处理插件mobile_number的使用

mobile_number 是一个Flutter插件,用于获取设备的手机号码。需要注意的是,该功能仅适用于Android平台,因为iOS不支持从SIM卡获取手机号码。此外,如果SIM卡中预先不存在手机号码,则无法返回电话号码。

安装

首先,在pubspec.yaml文件中添加依赖:

dependencies:
  mobile_number: ^latest_version # 替换为最新版本号

然后运行 flutter pub get 来安装插件。

对于仍然使用旧版 FlutterActivity 的项目(即导入了import io.flutter.app.FlutterActivity;),你需要在MainActivity.java中注册插件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MobileNumberPlugin.registerWith(registrarFor("com.amorenew.mobile_number.MobileNumberPlugin()"));
}

但如果你已经在使用新的Flutter嵌入式API(即导入了import io.flutter.embedding.android.FlutterActivity;),则无需手动注册,直接按照下面的步骤操作即可。

使用方法

检查和请求权限

在尝试获取手机号码之前,必须先检查并请求访问电话状态的权限。这里可以使用mobile_number自带的方法,也可以选择更强大的权限管理库如permission_handler来实现。

使用mobile_number自带的方法:

// 检查权限
bool hasPermission = await MobileNumber.hasPhonePermission;

if (!hasPermission) {
  // 请求权限
  await MobileNumber.requestPhonePermission;
}

// 监听权限变化
MobileNumber.listenPhonePermission((isPermissionGranted) {
  if (isPermissionGranted) {
    // 获取手机号码
  } else {
    // 处理未授权情况
  }
});

使用permission_handler

var status = await Permission.phone.status;
if (!status.isGranted) {
  status = await Permission.phone.request();
}

if (!status.isGranted) {
  // 返回或抛出错误
}

String? mobileNumber = await MobileNumber.mobileNumber;

获取手机号码

一旦获得了必要的权限,就可以调用MobileNumber.mobileNumber来获取当前SIM卡中的第一个号码:

final String? mobileNumber = await MobileNumber.mobileNumber;
print('Mobile Number: $mobileNumber');

获取双卡信息

对于支持双卡的设备,你可以通过MobileNumber.getSimCards来获取所有SIM卡的信息:

final List<SimCard>? simCards = await MobileNumber.getSimCards;
simCards?.forEach((sim) {
  print('Sim Card Info:');
  print('  Number: ${sim.number}');
  print('  Country Phone Prefix: ${sim.countryPhonePrefix}');
  print('  Carrier Name: ${sim.carrierName}');
  print('  Country ISO: ${sim.countryIso}');
  print('  Display Name: ${sim.displayName}');
  print('  Slot Index: ${sim.slotIndex}');
});

示例代码

以下是一个完整的示例应用程序,展示了如何结合上述所有步骤来展示用户的手机号码及SIM卡信息:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mobile_number/mobile_number.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? _mobileNumber;
  bool _isPermissionGranted = false;
  List<SimCard>? _simCards;

  @override
  void initState() {
    super.initState();
    MobileNumber.listenPhonePermission((isPermissionGranted) {
      if (isPermissionGranted) {
        _isPermissionGranted = isPermissionGranted;
        initMobileNumberState();
      }
    });

    initMobileNumberState();
  }

  Future<void> initMobileNumberState() async {
    if (!await MobileNumber.hasPhonePermission) {
      await MobileNumber.requestPhonePermission;
      return;
    } else {
      _isPermissionGranted = true;
    }

    try {
      _mobileNumber = await MobileNumber.mobileNumber;
      _simCards = await MobileNumber.getSimCards;
    } on PlatformException catch (e) {
      debugPrint("Failed to get mobile number because of '${e.message}'");
    }

    if (!mounted) return;

    setState(() {});
  }

  Widget fillCards() {
    if (_simCards == null || _simCards!.isEmpty) {
      return Text('No SIM cards found.');
    }

    return Column(
      children: _simCards!
          .map((SimCard sim) => ListTile(
                title: Text(
                    'Sim Card Number: (${sim.countryPhonePrefix}) - ${sim.number}\nCarrier Name: ${sim.carrierName}\nCountry Iso: ${sim.countryIso}\nDisplay Name: ${sim.displayName}\nSlot Index: ${sim.slotIndex}'),
              ))
          .toList(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Mobile Number Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Running on: $_mobileNumber\n'),
              Text('Permission for access sim card: $_isPermissionGranted\n'),
              fillCards()
            ],
          ),
        ),
      ),
    );
  }
}

此示例程序会显示用户的主要手机号码、是否已授予读取SIM卡信息的权限以及所有可用SIM卡的详细信息。请确保你已经在AndroidManifest.xml中声明了相关的权限,并且遵循了Google Play关于请求敏感权限的最佳实践。


更多关于Flutter手机号码处理插件mobile_number的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter手机号码处理插件mobile_number的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用mobile_number插件来处理手机号码的示例代码。这个插件通常用于验证和格式化国际手机号码。

首先,你需要在pubspec.yaml文件中添加mobile_number依赖:

dependencies:
  flutter:
    sdk: flutter
  mobile_number: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用mobile_number插件。以下是一个完整的示例,展示如何使用该插件来验证和格式化手机号码。

import 'package:flutter/material.dart';
import 'package:mobile_number/mobile_number.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Mobile Number Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PhoneNumberScreen(),
    );
  }
}

class PhoneNumberScreen extends StatefulWidget {
  @override
  _PhoneNumberScreenState createState() => _PhoneNumberScreenState();
}

class _PhoneNumberScreenState extends State<PhoneNumberScreen> {
  final TextEditingController _controller = TextEditingController();
  String _formattedNumber = '';
  bool _isValid = false;

  void _validateAndFormatNumber() {
    final phoneNumber = PhoneNumberUtil();
    final parsedNumber = phoneNumber.parse(_controller.text, null);

    if (parsedNumber != null && phoneNumber.isValidNumber(parsedNumber)) {
      setState(() {
        _formattedNumber = phoneNumber.format(parsedNumber, PhoneNumberFormat.E164);
        _isValid = true;
      });
    } else {
      setState(() {
        _formattedNumber = '';
        _isValid = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Phone Number Validation and Formatting'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter Phone Number',
                border: OutlineInputBorder(),
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _validateAndFormatNumber,
              child: Text('Validate and Format'),
            ),
            SizedBox(height: 16),
            if (_isValid)
              Text(
                'Formatted Number: $_formattedNumber',
                style: TextStyle(color: Colors.green),
              )
            else
              Text(
                'Invalid Number',
                style: TextStyle(color: Colors.red),
              ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个文本字段用于输入手机号码,一个按钮用于验证和格式化该号码,以及一个文本标签用于显示格式化后的号码或验证结果。

  1. 我们使用TextEditingController来管理文本字段的输入。
  2. 按下按钮时,我们调用_validateAndFormatNumber函数。
  3. 在该函数中,我们使用PhoneNumberUtil类的parse方法解析输入的手机号码,然后使用isValidNumber方法验证其有效性。
  4. 如果号码有效,我们使用format方法将其格式化为E.164格式,并更新UI显示格式化后的号码。
  5. 如果号码无效,我们更新UI显示“Invalid Number”。

这个示例展示了如何使用mobile_number插件来处理国际手机号码的验证和格式化。你可以根据需要进行进一步的自定义和扩展。

回到顶部