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

文章目录

  • [1. 概述](#1. 概述)
  • [2. 安装与配置](#2. 安装与配置)
  • [3. 基本使用方法](#3. 基本使用方法)
    • [3.1. 创建实例](#3.1. 创建实例)
    • [3.2. 区分平台获取信息](#3.2. 区分平台获取信息)
  • [4. 详细信息获取](#4. 详细信息获取)
    • [4.1. Android 设备信息](#4.1. Android 设备信息)
    • [4.2. iOS 设备信息](#4.2. iOS 设备信息)
    • [4.3. Web 浏览器信息](#4.3. Web 浏览器信息)
    • [4.4. Windows 设备信息](#4.4. Windows 设备信息)
  • [5. 实战示例](#5. 实战示例)
  • [6. 注意事项](#6. 注意事项)
    • [6.1. 权限问题](#6.1. 权限问题)
    • [6.2. 隐私保护](#6.2. 隐私保护)
    • [6.3. 平台差异处理](#6.3. 平台差异处理)
    • [6.4. 性能考虑](#6.4. 性能考虑)
  • [7. 常见问题解决](#7. 常见问题解决)
    • [7.1. 获取不到设备信息](#7.1. 获取不到设备信息)
    • [7.2. 部分信息为空或不准确](#7.2. 部分信息为空或不准确)
    • [7.3. 应用崩溃](#7.3. 应用崩溃)

在移动应用开发中,获取设备信息是一项常见需求,无论是为了统计分析打点、适配不同设备还是实现特定功能。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 依赖:

yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  device_info_plus: ^9.0.2  # 使用最新版本

运行命令安装依赖:

bash 复制代码
flutter pub get

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

iOS 配置

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

Android 配置

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

3. 基本使用方法

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

dart 复制代码
import 'package:device_info_plus/device_info_plus.dart';

3.1. 创建实例

dart 复制代码
final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();

3.2. 区分平台获取信息

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

dart 复制代码
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 设备信息:

dart 复制代码
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 设备的详细信息:

dart 复制代码
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 提供了浏览器相关信息:

dart 复制代码
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 设备信息

dart 复制代码
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. 实战示例

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

dart 复制代码
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:device_info_plus/device_info_plus.dart';

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

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

  @override
  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,
    };
  }

  @override
  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 版本是否兼容

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


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

往期文章

个人主页

相关推荐
不吃凉粉6 小时前
Android Studio USB串口通信
android·ide·android studio
zhangphil6 小时前
android studio设置大内存,提升编译速度
android·android studio
tsumikistep7 小时前
【前端】前端运行环境的结构
前端
你的人类朋友7 小时前
【Node】认识multer库
前端·javascript·后端
Aitter7 小时前
PDF和Word文件转换为Markdown的技术实现
前端·ai编程
编程乐学7 小时前
安卓非原创--基于Android Studio 实现的天气预报App
android·ide·android studio·课程设计·大作业·天气预报·安卓大作业
mapbar_front8 小时前
面试问题—上家公司的离职原因
前端·面试
昔人'8 小时前
css使用 :where() 来简化大型 CSS 选择器列表
前端·css
昔人'8 小时前
css `dorp-shadow`
前端·css
流***陌8 小时前
扭蛋机 Roll 福利房小程序前端功能设计:融合趣味互动与福利适配
前端·小程序