Flutter手机状态管理插件phone_state_handler的使用
Flutter手机状态管理插件phone_state_handler的使用
描述
此插件由 phone_state
修改而来。
该插件允许你快速且简便地知道你的Android或iOS设备是否正在接收电话,并了解通话的状态。
- 原生Android: TelephonyManager
- 原生iOS: CallKit
注意事项
- 在iOS模拟器上无法工作。
- 仅在Android上可以获取来电号码。
如何安装
Flutter
dependencies:
flutter:
sdk: flutter
phone_state: 1.0.1
Android: 在manifest文件中添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
警告: 添加 READ_CALL_LOG
权限后,如果您的应用没有合理的理由使用它,可能会被Google Play商店移除。但是如果不添加该权限,您将无法获取来电号码。
如何使用
获取电话状态流
StreamBuilder<PhoneState>(
initialData: PhoneState.nothing(),
stream: PhoneState.stream,
...
)
截图
完整示例代码
以下是一个完整的示例代码,展示了如何使用 phone_state_handler
插件来监控电话状态。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:phone_state_handler/phone_state_handler.dart';
void main() {
runApp(
const MaterialApp(
home: Example(),
),
);
}
class Example extends StatefulWidget {
const Example({super.key});
[@override](/user/override)
State<Example> createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
PhoneStateHandler status = PhoneStateHandler.nothing();
bool granted = false;
Future<bool> requestPermission() async {
// 请求权限
var status = await Permission.phone.request();
// 返回权限请求结果
return switch (status) {
PermissionStatus.denied ||
PermissionStatus.restricted ||
PermissionStatus.limited ||
PermissionStatus.permanentlyDenied =>
false,
PermissionStatus.provisional || PermissionStatus.granted => true,
};
}
[@override](/user/override)
void initState() {
super.initState();
if (Platform.isIOS) setStream();
}
void setStream() {
// 监听电话状态变化
PhoneStateHandler.stream.listen((event) {
setState(() {
status = event;
});
});
}
// 根据状态返回图标
IconData getIcons() {
return switch (status.status) {
PhoneStateHandlerStatus.NOTHING => Icons.clear,
PhoneStateHandlerStatus.CALL_INCOMING => Icons.add_call,
PhoneStateHandlerStatus.CALL_STARTED => Icons.call,
PhoneStateHandlerStatus.CALL_ENDED => Icons.call_end,
};
}
// 根据状态返回颜色
Color getColor() {
return switch (status.status) {
PhoneStateHandlerStatus.NOTHING ||
PhoneStateHandlerStatus.CALL_ENDED =>
Colors.red,
PhoneStateHandlerStatus.CALL_INCOMING => Colors.green,
PhoneStateHandlerStatus.CALL_STARTED => Colors.orange,
};
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Phone State'),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
if (Platform.isAndroid)
MaterialButton(
onPressed: !granted
? () async {
bool temp = await requestPermission();
setState(() {
granted = temp;
if (granted) {
setStream();
}
});
}
: null,
child: const Text('Request permission of Phone'),
),
const Text(
'Status of call',
style: TextStyle(fontSize: 24),
),
if (status.status == PhoneStateHandlerStatus.CALL_INCOMING ||
status.status == PhoneStateHandlerStatus.CALL_STARTED)
Text(
'Number: ${status.number}',
style: const TextStyle(fontSize: 24),
),
Icon(
getIcons(),
color: getColor(),
size: 80,
)
],
),
),
);
}
}
更多关于Flutter手机状态管理插件phone_state_handler的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter手机状态管理插件phone_state_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用phone_state_handler
插件的示例代码。这个插件允许你获取和处理设备的电话状态信息,比如来电、去电和短信等。请注意,由于权限和隐私的原因,使用这些功能时需要在Android和iOS平台上进行适当的配置。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加phone_state_handler
依赖:
dependencies:
flutter:
sdk: flutter
phone_state_handler: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置权限
Android
在android/app/src/main/AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAIT_FOR_PHONE_RINGER"/>
iOS
在ios/Runner/Info.plist
中添加以下权限请求(注意,iOS对电话状态的管理比较严格,可能需要额外的配置或审核):
<key>NSMicrophoneUsageDescription</key>
<string>App needs access to microphone</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to photo library</string>
<key>NSAppleMusicUsageDescription</key>
<string>App needs access to music library</string>
<key>NSContactsUsageDescription</key>
<string>App needs access to contacts</string>
<key>NSRemindersUsageDescription</key>
<string>App needs access to reminders</string>
<key>NSCalendarUsageDescription</key>
<string>App needs access to calendar</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
注意:上述iOS的权限配置可能并不完全适用于phone_state_handler
,因为iOS对电话和短信状态的访问限制较多,可能需要使用其他方法或向苹果申请特殊权限。
3. 使用插件
在你的Flutter项目中,你可以这样使用phone_state_handler
插件:
import 'package:flutter/material.dart';
import 'package:phone_state_handler/phone_state_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: PhoneStateScreen(),
);
}
}
class PhoneStateScreen extends StatefulWidget {
@override
_PhoneStateScreenState createState() => _PhoneStateScreenState();
}
class _PhoneStateScreenState extends State<PhoneStateScreen> {
PhoneStateHandler _phoneStateHandler = PhoneStateHandler();
@override
void initState() {
super.initState();
_phoneStateHandler.init();
// 监听来电事件
_phoneStateHandler.onIncomingCall.listen((call) {
print("Incoming Call: ${call.number}");
// 在这里处理来电逻辑
});
// 监听去电事件
_phoneStateHandler.onOutgoingCall.listen((call) {
print("Outgoing Call: ${call.number}");
// 在这里处理去电逻辑
});
// 监听短信事件
_phoneStateHandler.onSmsReceived.listen((sms) {
print("SMS Received: ${sms.body} from ${sms.number}");
// 在这里处理短信逻辑
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Phone State Handler Demo'),
),
body: Center(
child: Text('Listening for phone state changes...'),
),
);
}
@override
void dispose() {
_phoneStateHandler.dispose();
super.dispose();
}
}
注意事项
- 权限请求:在实际应用中,你需要在运行时请求用户授权这些权限,尤其是在Android上。
- iOS限制:iOS对电话和短信状态的访问非常严格,可能无法直接使用这个插件获取相关信息。
- 插件版本:确保你使用的是最新版本的
phone_state_handler
插件,因为API和功能可能会随着版本更新而变化。
希望这个示例代码能帮助你在Flutter项目中集成和使用phone_state_handler
插件。