文章目錄
- 1. 概述
- 2. 安裝與配置
- 3. 基本使用方法
- 3.1. 創建實例
- 3.2. 區分平臺獲取信息
- 4. 詳細信息獲取
- 4.1. Android 設備信息
- 4.2. iOS 設備信息
- 4.3. Web 瀏覽器信息
- 4.4. Windows 設備信息
- 5. 實戰示例
- 6. 注意事項
- 6.1. 權限問題
- 6.2. 隱私保護
- 6.3. 平臺差異處理
- 6.4. 性能考慮
- 7. 常見問題解決
- 7.1. 獲取不到設備信息
- 7.2. 部分信息為空或不準確
- 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
依賴:
dependencies:flutter:sdk: flutterdevice_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}'); // 例如: 31print('設備名稱: ${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.chromeprint('瀏覽器版本: ${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 版本是否兼容
更多詳細信息可以參考 官方文檔。
本次分享就到這兒啦,我是鵬多多,如果您看了覺得有幫助,歡迎評論,關注,點贊,轉發,我們下次見~
往期文章
- flutter-獲取父容器寬高及設置子元素百分比尺寸的教程
- flutter-本地存儲和數據持久化全解析
- vue中ref的詳解以及react的ref對比
- css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
- Web前端頁面開發阿拉伯語種適配指南
- flutter-使用extended_image操作圖片的加載和狀態處理以及緩存和下載
- flutter-制作可縮放底部彈出抽屜評論區效果
- flutter-實現Tabs吸頂的PageView效果
- Vue2全家桶+Element搭建的PC端在線音樂網站
- 助你上手Vue3全家桶之Vue3教程
- 超詳細!vue組件通信的10種方式
- 超詳細!Vuex手把手教程
- 使用nvm管理node.js版本以及更換npm淘寶鏡像源
- vue中利用.env文件存儲全局環境變量,以及配置vue啟動和打包命令
個人主頁
- CSDN
- GitHub
- 掘金