mm_device_info 0.0.1
mm_device_info: ^0.0.1 copied to clipboard
A production-ready Flutter plugin for retrieving comprehensive device, operating system, display, battery, storage, network, security, and application information across Android, iOS, Web, Windows, ma [...]
example/lib/main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:mm_device_info/mm_device_info.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
DeviceInfo? _deviceInfo;
String? _error;
final _mmDeviceInfoPlugin = MmDeviceInfo();
@override
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
setState(() {
_deviceInfo = null;
_error = null;
});
DeviceInfo? deviceInfo;
String? error;
try {
deviceInfo = await _mmDeviceInfoPlugin.getDeviceInfo();
} catch (e) {
error = e.toString();
}
if (!mounted) return;
setState(() {
_deviceInfo = deviceInfo;
_error = error;
});
}
String _formatBytes(int bytes, int decimals) {
if (bytes <= 0) return "0 B";
const suffixes = ["B", "KB", "MB", "GB", "TB"];
double size = bytes.toDouble();
int unitIndex = 0;
while (size >= 1024 && unitIndex < suffixes.length - 1) {
size /= 1024;
unitIndex++;
}
return "${size.toStringAsFixed(decimals)} ${suffixes[unitIndex]}";
}
String _formatUptime(int milliseconds) {
var duration = Duration(milliseconds: milliseconds);
var days = duration.inDays;
var hours = duration.inHours.remainder(24);
var minutes = duration.inMinutes.remainder(60);
var seconds = duration.inSeconds.remainder(60);
List<String> parts = [];
if (days > 0) parts.add("${days}d");
if (hours > 0) parts.add("${hours}h");
if (minutes > 0) parts.add("${minutes}m");
parts.add("${seconds}s");
return parts.join(" ");
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.blue),
home: Scaffold(
appBar: AppBar(
title: const Text('mm_device_info Example'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: initPlatformState,
),
],
),
body: _buildBody(),
),
);
}
Widget _buildBody() {
if (_error != null) {
return Center(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.error_outline, color: Colors.red, size: 64),
const SizedBox(height: 16),
const Text(
'Failed to load device info',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(
_error!,
textAlign: TextAlign.center,
style: const TextStyle(color: Colors.grey),
),
const SizedBox(height: 24),
ElevatedButton(
onPressed: initPlatformState,
child: const Text('Retry'),
),
],
),
),
);
}
if (_deviceInfo == null) {
return const Center(child: CircularProgressIndicator());
}
return ListView(
padding: const EdgeInsets.all(16),
children: [
_sectionHeader('Security Information'),
_infoTile('Is Emulator', _deviceInfo!.isEmulator ? "Yes" : "No"),
_infoTile('Is Rooted', _deviceInfo!.isRooted ? "Yes" : "No"),
_infoTile(
'Dev Mode',
_deviceInfo!.isDeveloperModeEnabled ? "Enabled" : "Disabled",
),
_infoTile(
'ADB Status',
_deviceInfo!.isAdbEnabled ? "Enabled" : "Disabled",
),
const Divider(),
_sectionHeader('System Diagnostics'),
_infoTile('Uptime', _formatUptime(_deviceInfo!.systemUptime)),
_infoTile('Kernel', _deviceInfo!.kernelVersion),
const Divider(),
_sectionHeader('Sensor Availability'),
_sensorTile('Accelerometer', _deviceInfo!.hasAccelerometer),
_sensorTile('Gyroscope', _deviceInfo!.hasGyroscope),
_sensorTile('Magnetometer', _deviceInfo!.hasMagnetometer),
_sensorTile('Proximity', _deviceInfo!.hasProximitySensor),
_sensorTile('Light Sensor', _deviceInfo!.hasLightSensor),
const Divider(),
_sectionHeader('Application Information'),
_infoTile('App Name', _deviceInfo!.appName),
_infoTile('Package Name', _deviceInfo!.packageName),
_infoTile('Version', _deviceInfo!.version),
_infoTile('Build Number', _deviceInfo!.buildNumber),
const Divider(),
_sectionHeader('Basic Information'),
_infoTile('Model', _deviceInfo!.model),
_infoTile('Brand', _deviceInfo!.brand),
_infoTile('Manufacturer', _deviceInfo!.manufacturer),
_infoTile('Android Version', _deviceInfo!.androidVersion),
_infoTile('SDK Version', _deviceInfo!.sdkVersion.toString()),
const Divider(),
_sectionHeader('Display Information'),
_infoTile(
'Resolution',
'${_deviceInfo!.displayWidth} x ${_deviceInfo!.displayHeight} px',
),
_infoTile('Density', _deviceInfo!.displayDensity.toStringAsFixed(2)),
_infoTile('DPI (Bucket)', _deviceInfo!.displayDpi.toString()),
_infoTile('Hardware XDPI', _deviceInfo!.displayXdpi.toStringAsFixed(2)),
_infoTile('Hardware YDPI', _deviceInfo!.displayYdpi.toStringAsFixed(2)),
_infoTile('Orientation', _deviceInfo!.displayOrientation),
_infoTile(
'Refresh Rate',
'${_deviceInfo!.displayRefreshRate.toStringAsFixed(1)} Hz',
),
const Divider(),
_sectionHeader('Battery Information'),
_infoTile('Level', '${_deviceInfo!.batteryLevel}%'),
_infoTile('Status', _deviceInfo!.batteryStatus),
_infoTile('Health', _deviceInfo!.batteryHealth),
const Divider(),
_sectionHeader('Storage & Memory'),
_infoTile(
'Total Storage',
_formatBytes(_deviceInfo!.totalInternalStorage, 2),
),
_infoTile(
'Free Storage',
_formatBytes(_deviceInfo!.freeInternalStorage, 2),
),
_infoTile('Total RAM', _formatBytes(_deviceInfo!.totalRam, 2)),
_infoTile('Available RAM', _formatBytes(_deviceInfo!.availableRam, 2)),
const Divider(),
_sectionHeader('Network Information'),
_infoTile('Type', _deviceInfo!.networkType),
_infoTile(
'WiFi Connected',
_deviceInfo!.isWifiConnected ? "Yes" : "No",
),
_infoTile(
'Mobile Data',
_deviceInfo!.isMobileDataConnected ? "Yes" : "No",
),
_infoTile('Operator', _deviceInfo!.networkOperator),
],
);
}
Widget _sectionHeader(String title) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Text(
title,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.blue,
),
),
);
}
Widget _infoTile(String title, String value) {
return ListTile(
title: Text(title),
trailing: Text(
value,
style: const TextStyle(fontWeight: FontWeight.w500),
),
);
}
Widget _sensorTile(String title, bool available) {
return ListTile(
title: Text(title),
trailing: Icon(
available ? Icons.check_circle : Icons.cancel,
color: available ? Colors.green : Colors.red,
),
);
}
}