Flutter手机号码处理插件mobile_number的使用
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
更多关于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应用,它包含一个文本字段用于输入手机号码,一个按钮用于验证和格式化该号码,以及一个文本标签用于显示格式化后的号码或验证结果。
- 我们使用
TextEditingController
来管理文本字段的输入。 - 按下按钮时,我们调用
_validateAndFormatNumber
函数。 - 在该函数中,我们使用
PhoneNumberUtil
类的parse
方法解析输入的手机号码,然后使用isValidNumber
方法验证其有效性。 - 如果号码有效,我们使用
format
方法将其格式化为E.164格式,并更新UI显示格式化后的号码。 - 如果号码无效,我们更新UI显示“Invalid Number”。
这个示例展示了如何使用mobile_number
插件来处理国际手机号码的验证和格式化。你可以根据需要进行进一步的自定义和扩展。