Flutter设备信息获取插件device_imei的使用

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

Flutter设备信息获取插件device_imei的使用

设备IMEI

Build version

此Flutter插件用于获取移动设备的真实IMEI。

开始使用

通过运行时权限,可以在Android 10及以上版本返回一个UUID,并在iOS上获取唯一标识符。该标识符是一个仅用于应用提供商的唯一字母数字字符串。

使用方法

import 'package:device_imei/device_imei.dart';

String imei = await DeviceImei.getImei();

平台支持

操作系统
Android
iOS

许可证

MIT许可证

作者

此插件由Moh. Abdul Haq Aulia开发。

赞助

如果您想支持此插件,可以:

示例代码

以下是一个完整的示例代码:

import 'dart:io';

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

import 'package:flutter/services.dart';
import 'package:device_imei/device_imei.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  String? deviceImei;
  String? type;
  String message = "请允许权限请求!";
  DeviceInfo? deviceInfo;
  bool getPermission = false;
  bool isloading = false;
  final _deviceImeiPlugin = DeviceImei();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
    _setPlatformType();
    _getImei();
  }

  _setPlatformType() {
    if (Platform.isAndroid) {
      setState(() {
        type = 'Android';
      });
    } else if (Platform.isIOS) {
      setState(() {
        type = 'iOS';
      });
    } else {
      setState(() {
        type = '其他';
      });
    }
  }

  _getImei() async {
    var permission = await Permission.phone.status;

    DeviceInfo? dInfo = await _deviceImeiPlugin.getDeviceInfo();

    if (dInfo != null) {
      setState(() {
        deviceInfo = dInfo;
      });
    }

    if (Platform.isAndroid) {
      if (permission.isGranted) {
        String? imei = await _deviceImeiPlugin.getDeviceImei();
        if (imei != null) {
          setState(() {
            getPermission = true;
            deviceImei = imei;
          });
        }
      } else {
        PermissionStatus status = await Permission.phone.request();
        if (status == PermissionStatus.granted) {
          setState(() {
            getPermission = false;
          });
          _getImei();
        } else {
          setState(() {
            getPermission = false;
            message = "权限未授予,请允许权限";
          });
        }
      }
    } else {
      String? imei = await _deviceImeiPlugin.getDeviceImei();
      if (imei != null) {
        setState(() {
          getPermission = true;
          deviceImei = imei;
        });
      }
    }
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch处理PlatformException。
    // 我们还处理消息可能返回null的情况。
    try {
      platformVersion = await _deviceImeiPlugin.getPlatformVersion() ?? 
          '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果在异步平台消息飞行期间小部件从树中被移除,我们希望丢弃回复而不是调用setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('运行于: $_platformVersion\n'),
              const Divider(),
              Text("ID : ${deviceInfo?.deviceId}"),
              Text("SDK INT : ${deviceInfo?.sdkInt}"),
              Text("型号 : ${deviceInfo?.model}"),
              Text("制造商 : ${deviceInfo?.manufacture}"),
              Text("设备 : ${deviceInfo?.device}"),
              const Divider(),
              isloading
                  ? const CircularProgressIndicator()
                  : getPermission
                      ? Text('设备 $type: $deviceImei\n')
                      : Text(message),
              Container(
                padding: const EdgeInsets.all(20.0),
                width: double.infinity,
                child: ElevatedButton(
                  onPressed: _getImei,
                  child: const Text("获取设备信息"),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter设备信息获取插件device_imei的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter设备信息获取插件device_imei的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用device_imei插件来获取设备IMEI信息的示例代码。请注意,获取设备IMEI信息通常涉及用户隐私,因此在发布应用时需确保遵守相关隐私政策和法律法规。

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

dependencies:
  flutter:
    sdk: flutter
  device_imei: ^x.y.z  # 请将x.y.z替换为插件的最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用device_imei插件:

  1. 导入插件

在你的Dart文件中(例如main.dart),导入device_imei插件:

import 'package:device_imei/device_imei.dart';
import 'package:flutter/material.dart';
  1. 请求权限(对于Android):

由于获取IMEI信息需要特定的权限,你需要在AndroidManifest.xml中添加相关权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 其他权限和配置 -->

    <!-- ... -->

</manifest>

此外,由于Android 6.0(API级别23)及以上版本需要在运行时请求权限,你可能还需要在Dart代码中处理权限请求(这里省略具体实现,但可以使用permission_handler插件来处理)。

  1. 获取IMEI信息

在你的Flutter代码中,你可以使用DeviceImeiPlugin来获取IMEI信息:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Device IMEI Example'),
        ),
        body: Center(
          child: DeviceImeiWidget(),
        ),
      ),
    );
  }
}

class DeviceImeiWidget extends StatefulWidget {
  @override
  _DeviceImeiWidgetState createState() => _DeviceImeiWidgetState();
}

class _DeviceImeiWidgetState extends State<DeviceImeiWidget> {
  String? imei;
  String? errorMessage;

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

  Future<void> _getDeviceImei() async {
    try {
      imei = await DeviceImeiPlugin.imei;
    } catch (e) {
      errorMessage = e.toString();
    }

    if (mounted) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        if (imei != null)
          Text('Device IMEI: $imei'),
        if (errorMessage != null)
          Text(
            'Error: $errorMessage',
            style: TextStyle(color: Colors.red),
          ),
      ],
    );
  }
}

在上述代码中,_getDeviceImei方法会尝试获取设备的IMEI信息,并在获取成功后更新UI。如果发生错误,它会捕获异常并更新错误消息。

注意事项

  • 隐私政策:确保你的应用有明确的隐私政策,并且用户同意收集他们的设备信息。
  • 权限处理:对于Android 6.0及以上版本,需要在运行时请求READ_PHONE_STATE权限。
  • iOS支持device_imei插件可能不支持iOS,因为iOS通常不允许直接访问设备的IMEI信息。

希望这个示例对你有帮助!

回到顶部