Flutter SIM卡检测插件sim_detector的使用

Flutter SIM卡检测插件sim_detector的使用

使用 sim_detector 插件可以在 Flutter 应用中监听 SIM 卡订阅信息的变化。以下是如何在 Flutter 应用中集成和使用该插件的详细步骤。

示例代码

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'dart:async';
import 'dart:io';

import 'package:sim_detector/sim_detector.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _messengerKey = GlobalKey<ScaffoldMessengerState>();
  StreamSubscription<dynamic>? SimSubscriptionIdStreamSubscription;
  String lastSubscriptionId = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    _requestPermission();
  }

  [@override](/user/override)
  void dispose() {
    SimSubscriptionIdStreamSubscription?.cancel();
    super.dispose();
  }

  Future<void> _requestPermission() async {
    await [
      Permission.phone
    ].request();
  }

  void _addSimSubscriptionChangeListener() async {
    if (Platform.isAndroid) {
      addSimSubscriptionChangeHandler().then((_) {
        listenForSimSubscriptionIdChange();
      });
    }
  }

  void _removeSimSubscriptionChangeListener() {
    if (Platform.isAndroid) {
      SimSubscriptionIdStreamSubscription?.cancel();
      removeSimSubscriptionChangeHandler();
    }
  }

  void _showSnackBar(String msg, BuildContext context) {
    final snackBar = SnackBar(content: Text(msg),);
    _messengerKey.currentState?.showSnackBar(snackBar);
  }

  void listenForSimSubscriptionIdChange() {
    SimSubscriptionIdStreamSubscription = simSubscriptionChangeStream?.listen((params) {
      List<int> subscribedSimSubscriptionIds = _getSubscribedSimSubscriptionIds(params as SubscribedSimInformation);
      print('Current sim subscription IDs: $subscribedSimSubscriptionIds');
      setState(() {
        lastSubscriptionId = subscribedSimSubscriptionIds.toString();
      });
    });
  }

  List<int> _getSubscribedSimSubscriptionIds(SubscribedSimInformation subscriptionInformation) {
    List<int> subscribedSimSubscriptionIdList = [];
    if (subscriptionInformation.simSlotZeroSubscriptionId != null) {
      subscribedSimSubscriptionIdList.add(subscriptionInformation.simSlotZeroSubscriptionId!);
    }
    if (subscriptionInformation.simSlotOneSubscriptionId != null) {
      subscribedSimSubscriptionIdList.add(subscriptionInformation.simSlotOneSubscriptionId!);
    }
    return subscribedSimSubscriptionIdList;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      scaffoldMessengerKey: _messengerKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SIM检测器'),
        ),
        body: Center(
          child: Column(
            children: [
              SizedBox(height: 20,),
              TextButton(
                style: TextButton.styleFrom(
                  padding: const EdgeInsets.all(16.0),
                  backgroundColor: Colors.blue,
                ),
                onPressed: () {
                  _addSimSubscriptionChangeListener();
                  _showSnackBar('添加了SimSubscriptionChangeListener', context);
                },
                child: const Text('添加SIM订阅处理程序', style: TextStyle(color: Colors.white),),
              ),
              SizedBox(height: 20,),
              TextButton(
                style: TextButton.styleFrom(
                  padding: const EdgeInsets.all(16.0),
                  backgroundColor: Colors.blue,
                ),
                onPressed: () {
                  _removeSimSubscriptionChangeListener();
                  _showSnackBar('移除了SimSubscriptionChangeListener', context);
                },
                child: const Text('移除SIM订阅处理程序', style: TextStyle(color: Colors.white),),
              ),
              SizedBox(height: 20,),
              Text("最后的subscriptionId = $lastSubscriptionId")
            ],
          ),
        ),
      ),
    );
  }
}

步骤说明

  1. 导入必要的库:

    import 'package:flutter/material.dart';
    import 'package:permission_handler/permission_handler.dart';
    import 'dart:async';
    import 'dart:io';
    import 'package:sim_detector/sim_detector.dart';
    
  2. 初始化应用:

    void main() {
      runApp(MyApp());
    }
    
  3. 定义应用状态类:

    class MyApp extends StatefulWidget {
      [@override](/user/override)
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      final _messengerKey = GlobalKey<ScaffoldMessengerState>();
      StreamSubscription<dynamic>? SimSubscriptionIdStreamSubscription;
      String lastSubscriptionId = '';
    
  4. 请求权限:

    [@override](/user/override)
    void initState() {
      super.initState();
      _requestPermission();
    }
    
    Future<void> _requestPermission() async {
      await [
        Permission.phone
      ].request();
    }
    
  5. 添加和移除 SIM 订阅变化监听器:

    void _addSimSubscriptionChangeListener() async {
      if (Platform.isAndroid) {
        addSimSubscriptionChangeHandler().then((_) {
          listenForSimSubscriptionIdChange();
        });
      }
    }
    
    void _removeSimSubscriptionChangeListener() {
      if (Platform.isAndroid) {
        SimSubscriptionIdStreamSubscription?.cancel();
        removeSimSubscriptionChangeHandler();
      }
    }
    
  6. 显示消息提示框:

    void _showSnackBar(String msg, BuildContext context) {
      final snackBar = SnackBar(content: Text(msg),);
      _messengerKey.currentState?.showSnackBar(snackBar);
    }
    
  7. 监听 SIM 订阅 ID 变化:

    void listenForSimSubscriptionIdChange() {
      SimSubscriptionIdStreamSubscription = simSubscriptionChangeStream?.listen((params) {
        List<int> subscribedSimSubscriptionIds = _getSubscribedSimSubscriptionIds(params as SubscribedSimInformation);
        print('Current sim subscription IDs: $subscribedSimSubscriptionIds');
        setState(() {
          lastSubscriptionId = subscribedSimSubscriptionIds.toString();
        });
      });
    }
    
  8. 获取已订阅的 SIM 卡订阅 ID:

    List<int> _getSubscribedSimSubscriptionIds(SubscribedSimInformation subscriptionInformation) {
      List<int> subscribedSimSubscriptionIdList = [];
      if (subscriptionInformation.simSlotZeroSubscriptionId != null) {
        subscribedSimSubscriptionIdList.add(subscriptionInformation.simSlotZeroSubscriptionId!);
      }
      if (subscriptionInformation.simSlotOneSubscriptionId != null) {
        subscribedSimSubscriptionIdList.add(subscriptionInformation.simSlotOneSubscriptionId!);
      }
      return subscribedSimSubscriptionIdList;
    }
    
  9. 构建应用界面:

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        scaffoldMessengerKey: _messengerKey,
        home: Scaffold(
          appBar: AppBar(
            title: const Text('SIM检测器'),
          ),
          body: Center(
            child: Column(
              children: [
                SizedBox(height: 20,),
                TextButton(
                  style: TextButton.styleFrom(
                    padding: const EdgeInsets.all(16.0),
                    backgroundColor: Colors.blue,
                  ),
                  onPressed: () {
                    _addSimSubscriptionChangeListener();
                    _showSnackBar('添加了SimSubscriptionChangeListener', context);
                  },
                  child: const Text('添加SIM订阅处理程序', style: TextStyle(color: Colors.white),),
                ),
                SizedBox(height: 20,),
                TextButton(
                  style: TextButton.styleFrom(
                    padding: const EdgeInsets.all(16.0),
                    backgroundColor: Colors.blue,
                  ),
                  onPressed: () {
                    _removeSimSubscriptionChangeListener();
                    _showSnackBar('移除了SimSubscriptionChangeListener', context);
                  },
                  child: const Text('移除SIM订阅处理程序', style: TextStyle(color: Colors.white),),
                ),
                SizedBox(height: 20,),
                Text("最后的subscriptionId = $lastSubscriptionId")
              ],
            ),
          ),
        ),
      );
    }
    

更多关于Flutter SIM卡检测插件sim_detector的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SIM卡检测插件sim_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sim_detector 是一个用于检测设备中 SIM 卡信息的 Flutter 插件。通过这个插件,开发者可以获取设备中 SIM 卡的数量、状态、运营商信息等。以下是使用 sim_detector 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sim_detector: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 sim_detector 插件:

import 'package:sim_detector/sim_detector.dart';

3. 获取 SIM 卡信息

你可以使用 SimDetector 类来获取 SIM 卡的相关信息。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SimCardInfoScreen(),
    );
  }
}

class SimCardInfoScreen extends StatefulWidget {
  @override
  _SimCardInfoScreenState createState() => _SimCardInfoScreenState();
}

class _SimCardInfoScreenState extends State<SimCardInfoScreen> {
  List<SimCard> simCards = [];

  @override
  void initState() {
    super.initState();
    _getSimCardInfo();
  }

  Future<void> _getSimCardInfo() async {
    try {
      List<SimCard> cards = await SimDetector.getSimCards();
      setState(() {
        simCards = cards;
      });
    } catch (e) {
      print("Error getting SIM card info: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SIM Card Info'),
      ),
      body: ListView.builder(
        itemCount: simCards.length,
        itemBuilder: (context, index) {
          SimCard card = simCards[index];
          return ListTile(
            title: Text('SIM ${index + 1}'),
            subtitle: Text('Carrier: ${card.carrierName}\nCountry: ${card.countryCode}'),
          );
        },
      ),
    );
  }
}

4. 处理权限

在某些 Android 设备上,获取 SIM 卡信息可能需要 READ_PHONE_STATE 权限。确保在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
回到顶部