flutter-使用device_info_plus獲取手機設備信息完整指南

文章目錄

  • 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
  • 掘金

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93302.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 時間處理 API 全解析:從 JDK7 到 JDK8 的演進

個人主頁-愛因斯晨 友友們&#xff0c;互三咯~ 目錄 個人主頁-愛因斯晨 ?編輯 前言 一、JDK7 時間處理基石 ——Date 類 &#xff08;一&#xff09;Date 類基本功能 &#xff08;二&#xff09;Date 類的局限性 二、格式化時間好幫手 ——SimpleDateFormat 類 &#…

duiLib 實現鼠標拖動標題欄時,窗口跟著拖動

1、布局文件&#xff0c;窗口需設置可拖動的標題欄區域&#xff1a;2、HandleMessage函數中&#xff0c;處理WM_LBUTTONDOWN消息&#xff0c;判斷鼠標在標題欄&#xff0c;讓系統處理窗口移動。代碼片段如下&#xff1a;else if (uMsg WM_LBUTTONDOWN) {// 獲取鼠標點擊坐標PO…

圖解嵌入式硬件知識庫體系

構建一個嵌入式硬件知識庫體系需要涵蓋嵌入式系統設計、開發和應用的各個方面,內容全面且系統化,適合不同層次的用戶。本文是一個結構化的嵌入式硬件知識庫體系,包含主要內容模塊及其詳細說明。 @startmindmap * 嵌入式硬件知識庫體系 ** 1. 嵌入式系統基礎 *** 概述與定義 …

機器學習的特征工程(特征構造、特征選擇、特征轉換和特征提取)詳解

特征工程是機器學習中至關重要的一步&#xff0c;它直接影響模型的性能和泛化能力。特征構造、特征選擇、特征轉換和特征提取——構成了特征工程的核心流程。下面我來系統地梳理一下它們的定義、方法和應用場景&#xff1a; 整理 by Moshow鄭鍇https://zhengkai.blog.csdn.net/…

Force Dimension觸覺力反饋設備在外科手術機器人遙操作和訓練中的應用

觸覺力反饋設備通過傳感器-執行器-信號處理閉環系統&#xff0c;在外科手術機器人領域實現了從遠程手術操作到虛擬訓練的全流程革新。外科手術機器人外科醫生廣博的專業知識往往受限于他們的主要工具——手。機器人的精確度和靈活性遠遠超過人手。然而&#xff0c;目前機器人還…

【網絡與爬蟲 00】試讀

網絡爬蟲技術全棧指南&#xff1a;從入門到AI時代的數據采集革命 關鍵詞&#xff1a;網絡爬蟲、Python爬蟲、數據采集、反爬技術、分布式爬蟲、AI爬蟲、Scrapy框架、自動化數據提取、爬蟲架構設計 摘要&#xff1a;本專欄是最全面的網絡爬蟲技術指南&#xff0c;涵蓋從基礎框架…

[Chat-LangChain] 前端用戶界面 | 核心交互組件 | 會話流管理

鏈接&#xff1a;https://python.langchain.com/docs/tutorials/qa_chat_history/ Chat-LangChain技術棧 : LangChainLangGraphNext.jsWeaviate (向量存儲)OpenAI (嵌入模型) docs&#xff1a;chat-langchain Chat LangChain 是一個智能聊天機器人&#xff0c;專為解答Lang…

編寫和運行 Playbook

編寫和運行 Playbook Playbook 介紹 adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過&#xff0c;若要真正發揮Ansible的能力&#xff0c;需要使用功能 playbook。 playbook 是一個文本文件&#xff0c;其中包含由一個或多個按特定順序運行的play組成的列表。…

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時&#xff0c;其他dom通過定位顯示在視頻上方&#xff0c;h5頁面上調試發現可以正常使用&#xff0c;效果如下&#xff1a; 當放在手機上看&#xff0c;會發現&#xff0c;僅僅剩一個視頻&#xff0c;本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…

歐姆龍CP系列以太網通訊實現上位機與觸摸屏監控

一、行業痛點在現代工業生產中&#xff0c;自動化生產線的控制系統的高效性與智能化程度對生產效率和產品質量有著至關重要的影響。然而&#xff0c;許多傳統工業生產線中使用的歐姆龍CP系列系列PLC以太網模塊&#xff0c;由于自身設計原因&#xff0c;并未配備以太網接口&…

【大語言模型 00】導讀

【大語言模型00】導讀&#xff1a;你的LLM全棧工程師進階之路關鍵詞&#xff1a;大語言模型、LLM、Transformer、深度學習、AI工程化、全棧開發、技術路線圖摘要&#xff1a;這是一份完整的大語言模型學習指南&#xff0c;涵蓋從數學基礎到商業落地的200篇深度文章。無論你是AI…

Business Magic

題目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of ?rk dolla…

在ubuntu系統上離線安裝jenkins的做法

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 1.安裝java環境和下載war包&#xff1a; Jenkins 依賴于 Java 環境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安裝OpenJDK 11和字體依賴 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…