device_info_sdk 1.0.0
device_info_sdk: ^1.0.0 copied to clipboard
A comprehensive Flutter SDK for retrieving detailed device information including hardware specs, battery status, display metrics, and platform-specific data on Android and iOS.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:device_info_sdk/device_info_sdk.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Device Info SDK Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: DeviceInfoDemo(),
);
}
}
class DeviceInfoDemo extends StatefulWidget {
@override
_DeviceInfoDemoState createState() => _DeviceInfoDemoState();
}
class _DeviceInfoDemoState extends State<DeviceInfoDemo> {
DeviceInfo? _deviceInfo;
bool _isLoading = true;
String? _error;
@override
void initState() {
super.initState();
_loadDeviceInfo();
}
Future<void> _loadDeviceInfo() async {
try {
setState(() {
_isLoading = true;
_error = null;
});
final sdk = DeviceInfoSDK.instance;
final deviceInfo = await sdk.getDeviceInfo();
setState(() {
_deviceInfo = deviceInfo;
_isLoading = false;
});
} catch (e) {
setState(() {
_error = e.toString();
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Device Info SDK Demo'),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
actions: [
IconButton(
icon: Icon(Icons.refresh),
onPressed: _loadDeviceInfo,
),
],
),
body: _buildBody(),
);
}
Widget _buildBody() {
if (_isLoading) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
SizedBox(height: 16),
Text('Loading device information...'),
],
),
);
}
if (_error != null) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.error, size: 64, color: Colors.red),
SizedBox(height: 16),
Text('Error: $_error'),
SizedBox(height: 16),
ElevatedButton(
onPressed: _loadDeviceInfo,
child: Text('Retry'),
),
],
),
);
}
if (_deviceInfo == null) {
return Center(child: Text('No device information available'));
}
return SingleChildScrollView(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildDeviceCard(),
SizedBox(height: 16),
_buildBatteryCard(),
SizedBox(height: 16),
_buildDisplayCard(),
SizedBox(height: 16),
_buildSystemCard(),
],
),
);
}
Widget _buildDeviceCard() {
return Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(_getDeviceIcon(), size: 24, color: Colors.blue),
SizedBox(width: 8),
Text(
'Device Information',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 16),
_buildInfoRow('Platform', _deviceInfo!.platform),
_buildInfoRow('Model', _deviceInfo!.model ?? 'Unknown'),
_buildInfoRow(
'Manufacturer', _deviceInfo!.manufacturer ?? 'Unknown'),
_buildInfoRow('Brand', _deviceInfo!.brand ?? 'Unknown'),
_buildInfoRow('Device Name', _deviceInfo!.deviceName ?? 'Unknown'),
_buildInfoRow('OS Version', _deviceInfo!.osVersion ?? 'Unknown'),
_buildInfoRow(
'Architecture', _deviceInfo!.cpuArchitecture ?? 'Unknown'),
_buildInfoRow(
'Serial Number', _deviceInfo!.serialNumber ?? 'Not available'),
_buildInfoRow('Is Rooted/Jailbroken',
(_deviceInfo!.isRooted ?? false) ? 'Yes' : 'No'),
],
),
),
);
}
Widget _buildBatteryCard() {
final battery = _deviceInfo!.battery;
if (battery == null) return SizedBox.shrink();
return Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.battery_std, size: 24, color: Colors.green),
SizedBox(width: 8),
Text(
'Battery Information',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 16),
_buildInfoRow('Level', '${battery.batteryLevel}%'),
_buildInfoRow('Status', battery.batteryStatus),
_buildInfoRow('Is Charging', battery.isCharging ? 'Yes' : 'No'),
_buildInfoRow('Is Full', battery.isFull ? 'Yes' : 'No'),
_buildInfoRow('Is Low', battery.isLow ? 'Yes' : 'No'),
_buildInfoRow(
'Power Save Mode', battery.isPowerSaveMode ? 'Yes' : 'No'),
if (battery.batteryHealth != null)
_buildInfoRow('Health', battery.batteryHealth!),
if (battery.batteryTechnology != null)
_buildInfoRow('Technology', battery.batteryTechnology!),
if (battery.batteryTemperature != null)
_buildInfoRow('Temperature', '${battery.batteryTemperature}°C'),
if (battery.batteryVoltage != null)
_buildInfoRow('Voltage', '${battery.batteryVoltage}V'),
],
),
),
);
}
Widget _buildDisplayCard() {
final display = _deviceInfo!.displayMetrics;
if (display == null) return SizedBox.shrink();
return Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.phone_android, size: 24, color: Colors.orange),
SizedBox(width: 8),
Text(
'Display Information',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 16),
if (display.widthPx != null && display.heightPx != null)
_buildInfoRow('Resolution',
'${display.widthPx!.toInt()} x ${display.heightPx!.toInt()} px'),
if (display.density != null)
_buildInfoRow('Density', '${display.density}'),
if (display.densityDpi != null)
_buildInfoRow('Density DPI', '${display.densityDpi}'),
if (display.xDpi != null) _buildInfoRow('X DPI', '${display.xDpi}'),
if (display.yDpi != null) _buildInfoRow('Y DPI', '${display.yDpi}'),
],
),
),
);
}
Widget _buildSystemCard() {
final platformSpecific = _deviceInfo!.platformSpecific;
if (platformSpecific == null) return SizedBox.shrink();
return Card(
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(Icons.settings, size: 24, color: Colors.purple),
SizedBox(width: 8),
Text(
'System Information',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 16),
if (_deviceInfo!.platform == 'Android')
..._buildAndroidSystemInfo(platformSpecific),
if (_deviceInfo!.platform == 'iOS')
..._buildIOSSystemInfo(platformSpecific),
SizedBox(height: 8),
ElevatedButton(
onPressed: () => _showFullPlatformData(platformSpecific),
child: Text('View All Platform Data'),
),
],
),
),
);
}
List<Widget> _buildAndroidSystemInfo(Map<String, dynamic> data) {
final version = data['version'] as Map<String, dynamic>?;
return [
if (data['product'] != null) _buildInfoRow('Product', data['product']),
if (data['board'] != null) _buildInfoRow('Board', data['board']),
if (data['hardware'] != null) _buildInfoRow('Hardware', data['hardware']),
if (version != null) ...[
_buildInfoRow('SDK Level', '${version['sdkInt']}'),
if (version['securityPatch'] != null)
_buildInfoRow('Security Patch', version['securityPatch']),
],
];
}
List<Widget> _buildIOSSystemInfo(Map<String, dynamic> data) {
final utsname = data['utsname'] as Map<String, dynamic>?;
return [
if (data['systemName'] != null)
_buildInfoRow('System Name', data['systemName']),
if (data['localizedModel'] != null)
_buildInfoRow('Localized Model', data['localizedModel']),
if (utsname != null) ...[
if (utsname['machine'] != null)
_buildInfoRow('Machine', utsname['machine']),
if (utsname['nodename'] != null)
_buildInfoRow('Node Name', utsname['nodename']),
],
];
}
Widget _buildInfoRow(String label, String value) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 4),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 120,
child: Text(
'$label:',
style: TextStyle(fontWeight: FontWeight.w500),
),
),
Expanded(
child: Text(
value,
style: TextStyle(color: Colors.grey[700]),
),
),
],
),
);
}
IconData _getDeviceIcon() {
switch (_deviceInfo!.platform.toLowerCase()) {
case 'android':
return Icons.android;
case 'ios':
return Icons.phone_iphone;
default:
return Icons.device_unknown;
}
}
void _showFullPlatformData(Map<String, dynamic> data) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Full Platform Data'),
content: Container(
width: double.maxFinite,
height: 400,
child: SingleChildScrollView(
child: Text(
_formatJson(data),
style: TextStyle(fontFamily: 'monospace', fontSize: 12),
),
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Close'),
),
],
),
);
}
String _formatJson(Map<String, dynamic> data) {
final buffer = StringBuffer();
data.forEach((key, value) {
buffer.writeln('$key: ${_formatValue(value)}');
});
return buffer.toString();
}
String _formatValue(dynamic value) {
if (value is Map) {
return '{\n${value.entries.map((e) => ' ${e.key}: ${_formatValue(e.value)}').join('\n')}\n}';
} else if (value is List) {
return '[${value.join(', ')}]';
} else {
return value.toString();
}
}
}