flutter-使用device_info_plus获取手机设备信息完整指南

发布于:2025-08-17 ⋅ 阅读:(20) ⋅ 点赞:(0)

在移动应用开发中,获取设备信息是一项常见需求,无论是为了统计分析打点、适配不同设备还是实现特定功能。Flutter 生态中,device_info_plus 插件是获取设备信息的最佳选择之一,它支持 iOS、Android、Web、Windows 等多个平台。本文将详细介绍如何使用该插件获取各类设备信息。

1. 概述

device_info_plus 是 Flutter Community 维护的一个跨平台插件,用于获取设备的详细信息。它是 device_info 插件的升级版,支持更多平台和更丰富的设备信息。

支持的平台

  • Android
  • iOS
  • Web
  • Windows
  • macOS
  • Linux

可获取的主要信息

  • 设备型号、制造商
  • 操作系统名称及版本
  • 硬件信息(如处理器、内存)
  • 唯一标识符(如 Android 的 Android ID,iOS 的 IDFV)
  • 屏幕分辨率等

2. 安装与配置

pubspec.yaml 文件中添加 device_info_plus 依赖:

dependencies:
  flutter:
    sdk: flutter
  device_info_plus: ^9.0.2  # 使用最新版本

运行命令安装依赖:

flutter pub get

大多数情况下,device_info_plus 不需要额外配置即可使用。但在某些特殊情况下,可能需要进行平台特定设置:

iOS 配置
如果需要访问某些敏感信息,可能需要在 Info.plist 中添加相应权限描述,但基本设备信息获取不需要额外配置。

Android 配置
基本设备信息获取不需要特殊权限,默认配置即可。

3. 基本使用方法

在需要使用的 Dart 文件中导入包:

import 'package:device_info_plus/device_info_plus.dart';

3.1. 创建实例

final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();

3.2. 区分平台获取信息

由于不同平台的设备信息结构不同,需要使用平台通道分别获取:

Future<void> getDeviceInfo() async {
  try {
    if (Platform.isAndroid) {
      AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
      print('设备型号: ${androidInfo.model}');
      print('Android 版本: ${androidInfo.version.release}');
      print('制造商: ${androidInfo.manufacturer}');
    } else if (Platform.isIOS) {
      IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
      print('设备型号: ${iosInfo.model}');
      print('iOS 版本: ${iosInfo.systemVersion}');
      print('设备名称: ${iosInfo.name}');
    } else if (Platform.isWindows) {
      WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo;
      print('设备名称: ${windowsInfo.computerName}');
      print('操作系统: ${windowsInfo.operatingSystem}');
    } else if (Platform.isWeb) {
      WebBrowserInfo webInfo = await deviceInfoPlugin.webBrowserInfo;
      print('浏览器名称: ${webInfo.browserName}');
      print('浏览器版本: ${webInfo.appVersion}');
    }
  } catch (e) {
    print('获取设备信息失败: $e');
  }
}

注意:需要导入 dart:io 包才能使用 Platform 类判断当前平台。

4. 详细信息获取

下面是区分系统来做的详细信息获取:

4.1. Android 设备信息

AndroidDeviceInfo 类提供了丰富的 Android 设备信息:

Future<void> getAndroidInfo() async {
  AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
  
  print('===== Android 设备信息 =====');
  print('设备型号: ${androidInfo.model}'); // 例如: "MI 9"
  print('制造商: ${androidInfo.manufacturer}'); // 例如: "Xiaomi"
  print('Android 版本: ${androidInfo.version.release}'); // 例如: "12"
  print('API 级别: ${androidInfo.version.sdkInt}'); // 例如: 31
  print('设备名称: ${androidInfo.device}'); // 例如: "cepheus"
  print('主板: ${androidInfo.board}'); // 例如: "msm8998"
  print('品牌: ${androidInfo.brand}'); // 例如: "Xiaomi"
  print('硬件: ${androidInfo.hardware}'); // 例如: "qcom"
  print('Android ID: ${androidInfo.androidId}'); // 设备唯一标识符
  print('指纹: ${androidInfo.fingerprint}'); // 设备指纹信息
  print('是否为模拟器: ${androidInfo.isPhysicalDevice}');
  print('Android 版本名称: ${androidInfo.version.codename}'); // 例如: "S"
  print('安全补丁级别: ${androidInfo.version.securityPatch}');
}

4.2. iOS 设备信息

IosDeviceInfo 类提供了 iOS 设备的详细信息:

Future<void> getIosInfo() async {
  IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
  
  print('===== iOS 设备信息 =====');
  print('设备型号: ${iosInfo.model}'); // 例如: "iPhone"
  print('设备名称: ${iosInfo.name}'); // 例如: "John's iPhone"
  print('系统版本: ${iosInfo.systemVersion}'); // 例如: "15.4"
  print('标识符ForVendor: ${iosInfo.identifierForVendor}'); // 应用供应商唯一标识符
  print('制造商: ${iosInfo.manufacturer}'); // 通常为 "Apple"
  print('产品名称: ${iosInfo.productName}'); // 例如: "iPhone 13"
  print('系统名称: ${iosInfo.systemName}'); // 例如: "iOS"
  print('是否为模拟器: ${iosInfo.isPhysicalDevice}');
  print('本地化模型: ${iosInfo.localizedModel}'); // 本地化的设备模型
  print('UUID: ${iosInfo.utsname.uuid}'); // 设备UUID
}

4.3. Web 浏览器信息

在 Web 平台上,WebBrowserInfo 提供了浏览器相关信息:

Future<void> getWebInfo() async {
  WebBrowserInfo webInfo = await deviceInfoPlugin.webBrowserInfo;
  
  print('===== Web 浏览器信息 =====');
  print('浏览器名称: ${webInfo.browserName}'); // 例如: BrowserName.chrome
  print('浏览器版本: ${webInfo.appVersion}'); // 例如: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
  print('设备内存: ${webInfo.deviceMemory}'); // 设备内存(GB)
  print('语言: ${webInfo.language}'); // 浏览器语言
  print('平台: ${webInfo.platform}'); // 例如: "Win32"
  print('用户代理: ${webInfo.userAgent}'); // 完整的用户代理字符串
  print('是否支持触摸: ${webInfo.hardwareConcurrency}'); // 处理器核心数
}

4.4. Windows 设备信息

Future<void> getWindowsInfo() async {
  WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo;
  
  print('===== Windows 设备信息 =====');
  print('计算机名称: ${windowsInfo.computerName}');
  print('操作系统: ${windowsInfo.operatingSystem}'); // 例如: "Windows 10 Pro"
  print('系统版本: ${windowsInfo.systemVersion}'); // 例如: "10.0.19044"
  print('设备制造商: ${windowsInfo.systemManufacturer}');
  print('设备型号: ${windowsInfo.systemProductName}');
  print('处理器: ${windowsInfo.processorName}');
}

5. 实战示例

下面是一个完整的示例,创建一个展示设备信息的页面:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:device_info_plus/device_info_plus.dart';

class DeviceInfoPage extends StatefulWidget {
  
  _DeviceInfoPageState createState() => _DeviceInfoPageState();
}

class _DeviceInfoPageState extends State<DeviceInfoPage> {
  final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
  Map<String, dynamic> _deviceData = <String, dynamic>{};

  
  void initState() {
    super.initState();
    _initDeviceInfo();
  }

  Future<void> _initDeviceInfo() async {
    Map<String, dynamic> deviceData;

    try {
      if (Platform.isAndroid) {
        deviceData = _readAndroidBuildData(await deviceInfoPlugin.androidInfo);
      } else if (Platform.isIOS) {
        deviceData = _readIosDeviceInfo(await deviceInfoPlugin.iosInfo);
      } else if (Platform.isWindows) {
        deviceData = _readWindowsDeviceInfo(await deviceInfoPlugin.windowsInfo);
      } else if (Platform.isWeb) {
        deviceData = _readWebBrowserInfo(await deviceInfoPlugin.webBrowserInfo);
      } else {
        deviceData = {'未支持的平台': '当前平台暂不支持设备信息获取'};
      }
    } catch (e) {
      deviceData = {'错误': '无法获取设备信息: $e'};
    }

    setState(() {
      _deviceData = deviceData;
    });
  }

  Map<String, dynamic> _readAndroidBuildData(AndroidDeviceInfo build) {
    return <String, dynamic>{
      '设备型号': build.model,
      '制造商': build.manufacturer,
      '品牌': build.brand,
      'Android 版本': build.version.release,
      'API 级别': build.version.sdkInt,
      '设备 ID': build.androidId,
      '主板': build.board,
      '硬件': build.hardware,
      '是否为物理设备': build.isPhysicalDevice,
      '安全补丁级别': build.version.securityPatch,
    };
  }

  Map<String, dynamic> _readIosDeviceInfo(IosDeviceInfo data) {
    return <String, dynamic>{
      '设备型号': data.model,
      '设备名称': data.name,
      '系统版本': data.systemVersion,
      '供应商 ID': data.identifierForVendor,
      '产品名称': data.productName,
      '系统名称': data.systemName,
      '是否为物理设备': data.isPhysicalDevice,
      '本地化模型': data.localizedModel,
    };
  }

  Map<String, dynamic> _readWindowsDeviceInfo(WindowsDeviceInfo data) {
    return <String, dynamic>{
      '计算机名称': data.computerName,
      '操作系统': data.operatingSystem,
      '系统版本': data.systemVersion,
      '制造商': data.systemManufacturer,
      '产品名称': data.systemProductName,
      '处理器': data.processorName,
    };
  }

  Map<String, dynamic> _readWebBrowserInfo(WebBrowserInfo data) {
    return <String, dynamic>{
      '浏览器名称': data.browserName.toString(),
      '浏览器版本': data.appVersion,
      '设备内存(GB)': data.deviceMemory,
      '语言': data.language,
      '平台': data.platform,
      '处理器核心数': data.hardwareConcurrency,
    };
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('设备信息'),
      ),
      body: ListView(
        children: _deviceData.entries.map((entry) {
          return ListTile(
            title: Text(entry.key),
            subtitle: Text(entry.value.toString()),
          );
        }).toList(),
      ),
    );
  }
}

这个示例创建了一个页面,能够根据不同平台显示相应的设备信息,使用 ListView 展示所有获取到的设备属性。

6. 注意事项

下面列出了一些常见的注意事项:

6.1. 权限问题

  • 大多数设备信息的获取不需要特殊权限
  • 对于某些敏感信息,可能需要申请相应权限
  • 不要滥用设备唯一标识符,注意用户隐私保护

6.2. 隐私保护

  • 遵循 GDPR、CCPA 等隐私法规
  • 明确告知用户你正在收集哪些设备信息
  • 仅收集必要的设备信息,避免过度收集
  • 对于唯一标识符,考虑使用匿名化处理

6.3. 平台差异处理

  • 始终检查当前平台,避免在不支持的平台上调用相关方法
  • 对于跨平台应用,为不同平台提供统一的数据结构
  • 处理可能的异常,如某些设备信息可能无法获取

6.4. 性能考虑

  • 设备信息获取是异步操作,避免在 UI 线程中阻塞
  • 不需要频繁获取设备信息,通常在应用启动时获取一次即可
  • 对于可能变化的信息(如网络状态),考虑使用其他专门的插件

7. 常见问题解决

下面列出了一些常见的问题和解决方法:

7.1. 获取不到设备信息

  • 检查是否添加了正确的依赖
  • 确保在异步环境中调用获取方法
  • 检查平台权限设置
  • 查看控制台错误信息,排查问题

7.2. 部分信息为空或不准确

  • 某些设备可能限制访问特定信息
  • 模拟器上的某些信息可能不准确
  • 不同厂商的设备可能有不同的实现

7.3. 应用崩溃

  • 确保在调用平台特定方法前检查平台类型
  • 为所有异步操作添加错误捕获
  • 检查插件版本与 Flutter 版本是否兼容

更多详细信息可以参考 官方文档


本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

个人主页


网站公告

今日签到

点亮在社区的每一天
去签到