A Flutter package to retrieve unique device identifiers and comprehensive device information across different platforms (Android, iOS, Windows, macOS, Linux, and Web).
Features
- ✅ Get unique device identifiers for all platforms
- ✅ Retrieve comprehensive device information
- ✅ Support for Android, iOS, Windows, macOS, Linux, and Web
- ✅ Type-safe model classes
- ✅ Easy to use API
Platform Support
| Platform | Identifier Type | Description |
|---|---|---|
| Android | Android ID | Unique per app installation and device |
| iOS | identifierForVendor | Persists until all apps from vendor are uninstalled |
| Windows | Device ID | System-level unique identifier |
| macOS | System GUID | System-level unique identifier |
| Linux | Machine ID | System-level unique identifier |
| Web | Browser Fingerprint | Hash based on browser info |
Installation
Add this to your package's pubspec.yaml file:
dependencies:
native_id: ^1.0.0
Then run:
flutter pub get
Usage
Get Device ID Only
import 'package:native_id/native_id.dart';
// Get unique device identifier
final deviceId = await NativeIdService.getDeviceId();
print('Device ID: $deviceId');
Get Comprehensive Device Information
import 'package:native_id/native_id.dart';
// Get detailed device information
final deviceInfo = await NativeIdService.getDeviceInfo();
print('Platform: ${deviceInfo.platform}');
print('Device ID: ${deviceInfo.deviceId}');
print('Model: ${deviceInfo.model}');
print('Manufacturer: ${deviceInfo.manufacturer}');
print('OS Version: ${deviceInfo.osVersion}');
print('Is Physical Device: ${deviceInfo.isPhysicalDevice}');
// Access additional platform-specific info
deviceInfo.additionalInfo?.forEach((key, value) {
print('$key: $value');
});
// Convert to JSON
final json = deviceInfo.toJson();
Complete Example
import 'package:flutter/material.dart';
import 'package:native_id/native_id.dart';
class DeviceInfoScreen extends StatefulWidget {
@override
_DeviceInfoScreenState createState() => _DeviceInfoScreenState();
}
class _DeviceInfoScreenState extends State<DeviceInfoScreen> {
String? _deviceId;
DeviceInfoModel? _deviceInfo;
@override
void initState() {
super.initState();
_loadDeviceInfo();
}
Future<void> _loadDeviceInfo() async {
final deviceId = await NativeIdService.getDeviceId();
final deviceInfo = await NativeIdService.getDeviceInfo();
setState(() {
_deviceId = deviceId;
_deviceInfo = deviceInfo;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Device Info')),
body: _deviceInfo == null
? Center(child: CircularProgressIndicator())
: SingleChildScrollView(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Device ID: $_deviceId'),
SizedBox(height: 16),
Text('Platform: ${_deviceInfo!.platform}'),
Text('Model: ${_deviceInfo!.model}'),
Text('Manufacturer: ${_deviceInfo!.manufacturer}'),
Text('OS Version: ${_deviceInfo!.osVersion}'),
],
),
),
);
}
}
Legacy
import 'package:native_id/legacy.dart';
// Get unique device identifier
final deviceId = await NativeId.getId();
print('Device ID: $deviceId');
Important Notes
IMEI Access Restrictions
Android 10+: Accessing IMEI requires READ_PRIVILEGED_PHONE_STATE permission, which is only granted to system apps. Regular apps cannot access IMEI due to privacy restrictions.
iOS: IMEI is not accessible through public APIs.
This package uses the best available identifiers for each platform that don't require special permissions.
Identifier Persistence
- Android:
androidIdchanges when the app is reinstalled or the device is factory reset - iOS:
identifierForVendorpersists until all apps from the same vendor are uninstalled - Windows/macOS/Linux: System-level identifiers are generally stable across app reinstalls
Privacy Considerations
Always inform users if you're collecting device identifiers and comply with privacy regulations (GDPR, CCPA, etc.).
Platform-Specific Setup
Android
No additional setup required. The package uses device_info_plus which handles Android permissions automatically.
iOS
No additional setup required.
Windows/macOS/Linux
No additional setup required.
Web
Works out of the box. The identifier is based on browser information.
API Reference
NativeIdService
Methods
getDeviceId()
Returns a unique device identifier as a String?.
static Future<String?> getDeviceId()
getDeviceInfo()
Returns comprehensive device information as a DeviceInfoModel.
static Future<DeviceInfoModel> getDeviceInfo()
DeviceInfoModel
Properties
platform: Platform name (Android, iOS, Windows, macOS, Linux, Web)deviceId: Unique device identifiermodel: Device modelmanufacturer: Device manufacturerbrand: Device brandname: Device nameosVersion: Operating system versionsdkVersion: SDK/API versionisPhysicalDevice: Whether this is a physical deviceadditionalInfo: Additional platform-specific informationerror: Error message if any
Methods
toJson(): Convert to JSONfromJson(Map<String, dynamic> json): Create from JSONtoString(): String representation
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the BSD-3-Clause License - see the LICENSE file for details.
Credits
This package is built on top of device_info_plus.
Libraries
- legacy
- native_id
- A Flutter package to retrieve unique device identifiers and comprehensive device information across different platforms (Android, iOS, Windows, macOS, Linux, and Web).
- native_id_method_channel
- native_id_platform_interface