Flutter手机状态管理插件phone_state_handler的使用

Flutter手机状态管理插件phone_state_handler的使用

描述

此插件由 phone_state 修改而来。

该插件允许你快速且简便地知道你的Android或iOS设备是否正在接收电话,并了解通话的状态。

注意事项

  • 在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&lt;PhoneState&gt;(
  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&lt;Example&gt; createState() =&gt; _ExampleState();
}

class _ExampleState extends State&lt;Example&gt; {
  PhoneStateHandler status = PhoneStateHandler.nothing();
  bool granted = false;

  Future&lt;bool&gt; requestPermission() async {
    // 请求权限
    var status = await Permission.phone.request();

    // 返回权限请求结果
    return switch (status) {
      PermissionStatus.denied ||
      PermissionStatus.restricted ||
      PermissionStatus.limited ||
      PermissionStatus.permanentlyDenied =&gt;
        false,
      PermissionStatus.provisional || PermissionStatus.granted =&gt; 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 =&gt; Icons.clear,
      PhoneStateHandlerStatus.CALL_INCOMING =&gt; Icons.add_call,
      PhoneStateHandlerStatus.CALL_STARTED =&gt; Icons.call,
      PhoneStateHandlerStatus.CALL_ENDED =&gt; Icons.call_end,
    };
  }

  // 根据状态返回颜色
  Color getColor() {
    return switch (status.status) {
      PhoneStateHandlerStatus.NOTHING ||
      PhoneStateHandlerStatus.CALL_ENDED =&gt;
        Colors.red,
      PhoneStateHandlerStatus.CALL_INCOMING =&gt; Colors.green,
      PhoneStateHandlerStatus.CALL_STARTED =&gt; 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

1 回复

更多关于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();
  }
}

注意事项

  1. 权限请求:在实际应用中,你需要在运行时请求用户授权这些权限,尤其是在Android上。
  2. iOS限制:iOS对电话和短信状态的访问非常严格,可能无法直接使用这个插件获取相关信息。
  3. 插件版本:确保你使用的是最新版本的phone_state_handler插件,因为API和功能可能会随着版本更新而变化。

希望这个示例代码能帮助你在Flutter项目中集成和使用phone_state_handler插件。

回到顶部