react-native-device-info
Device Information for React Native.
TOC
Installation
Using npm:
npm install --save react-native-device-info
or using yarn:
yarn add react-native-device-info
⚠️ If you are on React Native > 0.47, you must use version 0.11.0 of this library or higher
AndroidX Support
AndroidX is supported in a non-breaking / backwards-compatible way by using overrides in your android/build.gradle
file's "ext" block
Android
...
ext {
// dependency versions
googlePlayServicesVersion = "17.0.0" // default: "16.1.0" - pre-AndroidX, override for AndroidX
compileSdkVersion = "28" // default: 28 (28 is required for AndroidX)
targetSdkVersion = "28" // default: 28 (28 is required for AndroidX)
supportLibVersion = '1.0.2' // Use '28.0.0' or don't specify for old libraries, '1.0.2' or similar for AndroidX
mediaCompatVersion = '1.0.1' // Do not specify if using old libraries, specify '1.0.1' or similar for androidx.media:media dependency
supportV4Version = '1.0.0' // Do not specify if using old libraries, specify '1.0.0' or similar for androidx.legacy:legacy-support-v4 dependency
}
...
Linking (for React Native <= 0.59 only, React Native >= 0.60 skip this as auto-linking should work)
Automatic
react-native link react-native-device-info
(or using rnpm
for versions of React Native < 0.27)
rnpm link react-native-device-info
For iOS users using Pods
You still need to run pod install
after running the above link command inside your IOS
folder.
Manual
iOS (via CocoaPods)
Add the following lines to your build targets in your Podfile
pod 'React', :path => '../node_modules/react-native'
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "React"
target.remove_from_project
end
targets_to_ignore = %w(React yoga)
if targets_to_ignore.include? target.name
target.remove_from_project
end
end
end
Then run pod install
iOS (without CocoaPods)
In XCode, in the project navigator:
- Right click Libraries
- Add Files to [your project's name]
- Go to
node_modules/react-native-device-info/ios
- Add the file
RNDeviceInfo.xcodeproj
In XCode, in the project navigator, select your project.
- Add the
libRNDeviceInfo.a
from the deviceinfo project to your project's Build Phases ➜ Link Binary With Libraries - Click
.xcodeproj
file you added before in the project navigator and go the Build Settings tab. Make sure All is toggled on (instead of Basic). - Look for Header Search Paths and make sure it contains both
$(SRCROOT)/../react-native/React
and $(SRCROOT)/../../React
- Mark both as recursive (should be OK by default).
Run your project (Cmd+R)
(Thanks to @brysgo for writing the instructions)
Android
- optional in
android/build.gradle
:
...
ext {
// dependency versions
googlePlayServicesVersion = "<Your play services version>" // default: "16.1.0" - pre-AndroidX, override for AndroidX
compileSdkVersion = "<Your compile SDK version>" // default: 28
targetSdkVersion = "<Your target SDK version>" // default: 28
}
...
- in
android/app/build.gradle
:
dependencies {
...
implementation "com.facebook.react:react-native:+" // From node_modules
+ implementation project(':react-native-device-info')
}
- in
android/settings.gradle
:
...
include ':app'
+ include ':react-native-device-info'
+ project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android')
With React Native 0.29+
+ import com.learnium.RNDeviceInfo.RNDeviceInfo;
public class MainApplication extends Application implements ReactApplication {
//......
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
+ new RNDeviceInfo(),
new MainReactPackage()
);
}
......
}
With older versions of React Native
+ import com.learnium.RNDeviceInfo.RNDeviceInfo;
public class MainActivity extends ReactActivity {
......
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
+ new RNDeviceInfo(),
new MainReactPackage()
);
}
}
NOTE: If you faced with this error: Could not resolve all files for configuration ':react-native-device-info:debugCompileClasspath'.
, in build.gradle
put google()
in the first line (according to https://stackoverflow.com/a/50748249)
allprojects {
repositories {
+ google()
...
}
}
(Thanks to @chirag04 for writing the instructions)
Windows
- Open the solution in Visual Studio for your Windows apps
- right click your in the Explorer and click Add > Existing Project...
- Navigate to
./<app-name>/node_modules/react-native-device-info/windows/RNDeviceInfo
and add RNDeviceInfo.csproj
- this time right click on your React Native Windows app under your solutions directory and click Add > Reference...
- check the
RNDeviceInfo
you just added and press ok - open up
MainReactNativeHost.cs
for your app and edit the file like so:
+ using RNDeviceInfo;
......
protected override List<IReactPackage> Packages => new List<IReactPackage>
{
new MainReactPackage(),
+ new RNDeviceInfoPackage(),
};
(Thanks to @josephan for writing the instructions)
Usage
import DeviceInfo from 'react-native-device-info';
import { getUniqueId, getManufacturer } from 'react-native-device-info';
API
Note that many APIs are platform-specific. If there is no implementation for a platform, then the "default" return values you will receive are 'unknown' for string, '-1' for number, and 'false' for boolean. Arrays and Objects will be empty ('[]' and '{}' respectively).
Every API returns a Promise but also has a corresponding API with 'Sync' on the end that operates synchronously. For example, you may prefer to call 'getCameraPresenceSync()' during your app bootstrap to avoid async calls during the first parts of app startup.
getApiLevel()
Gets the API level.
Examples
DeviceInfo.getApiLevel().then(apiLevel => {
});
Notes
See API Levels
getAndroidId()
Gets the ANDROID_ID. See API documentation for appropriate use.
Examples
DeviceInfo.getAndroidId().then(androidId => {
});
getApplicationName()
Gets the application name.
Examples
DeviceInfo.getApplicationName().then(appName => {
});
getBaseOs()
The base OS build the product is based on.
Examples
DeviceInfo.getBaseOs().then(baseOs => {
});
getBatteryLevel()
Gets the battery level of the device as a float comprised between 0 and 1.
Examples
DeviceInfo.getBatteryLevel().then(batteryLevel => {
});
Notes
To be able to get actual battery level enable battery monitoring mode for application.
Add this code:
[UIDevice currentDevice].batteryMonitoringEnabled = true;
to AppDelegate.m application:didFinishLaunchingWithOptions:
Returns -1 on the iOS Simulator
getBootloader()
The system bootloader version number.
Examples
DeviceInfo.getBootloader().then(bootloader => {
});
getBrand()
Gets the device brand.
Examples
DeviceInfo.getBrand().then(brand => {
});
getBuildNumber()
Gets the application build number.
Examples
DeviceInfo.getBuildNumber().then(buildNumber => {
});
getBundleId()
Gets the application bundle identifier.
Examples
DeviceInfo.getBundleId().then(bundleId => {
});
getCameraPresence()
Tells if the device have any camera now.
Examples
DeviceInfo.getCameraPresence()
.then(isCameraPresent => {
})
.catch(cameraAccessException => {
});
Notes
- Hot add/remove of camera is supported.
- Returns the status of the physical presence of the camera. If camera present but your app don't have permissions to use it, getCameraPresence will still return the true
getCarrier()
Gets the carrier name (network operator).
Examples
DeviceInfo.getCarrier().then(carrier => {
});
getCodename()
The current development codename, or the string "REL" if this is a release build.
Examples
DeviceInfo.getCodename().then(codename => {
});
getDevice()
The name of the industrial design.
Examples
DeviceInfo.getDevice().then(device => {
});
getDeviceId()
Gets the device ID.
Examples
DeviceInfo.getDeviceId().then(deviceId => {
});
getDisplay()
A build ID string meant for displaying to the user.
Examples
DeviceInfo.getDisplay().then(display => {
});
getDeviceName()
Gets the device name.
Examples
DeviceInfo.getDeviceName().then(deviceName => {
});
This used to require the android.permission.BLUETOOTH but the new implementation in v3 does not need it. You may remove that from your AndroidManifest.xml if you had it for this API.
getFirstInstallTime()
Gets the time at which the app was first installed, in milliseconds.
Examples
DeviceInfo.getFirstInstallTime().then(firstInstallTime => {
});
getFingerprint()
A string that uniquely identifies this build.
Examples
DeviceInfo.getFingerprint().then(fingerprint => {
});
getFontScale()
Gets the device font scale.
The font scale is the ratio of the current system font to the "normal" font size, so if normal text is 10pt and the system font is currently 15pt, the font scale would be 1.5
This can be used to determine if accessability settings has been changed for the device; you may want to re-layout certain views if the font scale is significantly larger ( > 2.0 )
In iOS App Extensions this call always returns 1.0, see #625.
Examples
DeviceInfo.getFontScale().then(fontScale => {
});
getFreeDiskStorage()
Gets available storage size, in bytes.
Examples
DeviceInfo.getFreeDiskStorage().then(freeDiskStorage => {
});
Notes
From developer.android.com:
Return the primary shared/external storage directory.
Note: don't be confused by the word "external" here. This directory can better be thought as
media/shared storage. It is a filesystem that can hold a relatively large amount of data and
that is shared across all applications (does not enforce permissions). Traditionally this is
an SD card, but it may also be implemented as built-in storage in a device that is distinct
from the protected internal storage and can be mounted as a filesystem on a computer.
getHardware()
The name of the hardware (from the kernel command line or /proc).
Examples
DeviceInfo.getHardware().then(hardware => {
};
getHost()
Hostname
Examples
DeviceInfo.getHost().then(host => {
});
getIpAddress()
Deprecated Gets the device current IP address. (of wifi only)
Switch to @react-native-community/netinfo or react-native-network-info
Examples
DeviceInfo.getIpAddress().then(ip => {
});
Android Permissions
Notes
Support for iOS was added in 0.22.0
getIncremental()
The internal value used by the underlying source control to represent this build.
Examples
DeviceInfo.getIncremental().then(incremental => {
});
getInstallReferrer()
Gets the referrer string upon application installation.
Examples
DeviceInfo.getInstallReferrer().then(installReferrer => {
});
getInstanceId()
Gets the application instance ID.
Examples
DeviceInfo.getInstanceId().then(instanceId => {
});
Notes
See https://developers.google.com/instance-id/
getLastUpdateTime()
Gets the time at which the app was last updated, in milliseconds.
Examples
DeviceInfo.getLastUpdateTime().then(lastUpdateTime => {
});
getMacAddress()
Gets the network adapter MAC address.
Examples
DeviceInfo.getMacAddress().then(mac => {
});
Android Permissions
Notes
iOS: This method always return "02:00:00:00:00:00" as retrieving the MAC address is disabled since iOS 7
getManufacturer()
Gets the device manufacturer.
Examples
DeviceInfo.getManufacturer().then(manufacturer => {
});
getMaxMemory()
Returns the maximum amount of memory that the VM will attempt to use, in bytes.
Examples
DeviceInfo.getMaxMemory().then(maxMemory => {
});
getModel()
Gets the device model.
iOS warning: The list with device names is maintained by the community and could lag new devices. It is recommended to use getDeviceId()
since it's more reliable and always up-to-date with new iOS devices. We do accept pull requests that add new iOS devices to the list with device names.
Examples
DeviceInfo.getModel().then(model => {
});
getPhoneNumber()
Gets the device phone number.
Examples
DeviceInfo.getPhoneNumber().then(phoneNumber => {
});
Android Permissions
Notes
This can return undefined
in certain cases and should not be relied on. SO entry on the subject.
getPowerState()
Gets the power state of the device including the battery level, whether it is plugged in, and if the system is currently operating in low power mode.
Displays a warning on iOS if battery monitoring not enabled, or if attempted on an emulator (where monitoring is not possible)
Examples
DeviceInfo.getPowerState().then(state => {
});
getProduct()
The name of the overall product.
Examples
DeviceInfo.getProduct().then(product => {
});
getPreviewSdkInt()
The developer preview revision of a prerelease SDK.
Examples
DeviceInfo.getPreviewSdkInt().then(previewSdkInt => {
});
getReadableVersion()
Gets the application human readable version (same as getVersion() + '.' + getBuildCode())
Examples
DeviceInfo.getReadableVersion().then(readableVersion => {
});
getSerialNumber()
Gets the device serial number. Will be 'unknown' in almost all cases unless you have a privileged app and you know what you're doing.
Examples
DeviceInfo.getSerialNumber().then(serialNumber => {
});
getSecurityPatch()
The user-visible security patch level.
Examples
DeviceInfo.getSecurityPatch().then(securityPatch => {
});
getSystemName()
Gets the device OS name.
Examples
DeviceInfo.getSystemName().then(systemName => {
});
getSystemVersion()
Gets the device OS version.
Examples
DeviceInfo.getSystemVersion().then(systemVersion => {
});
getBuildId()
Gets build number of the operating system.
Examples
DeviceInfo.getBuildId().then(buildId => {
});
getTags()
Comma-separated tags describing the build.
Examples
DeviceInfo.getTags().then(tags => {
});
getType()
The type of build.
Examples
DeviceInfo.getType().then(type => {
});
getTotalDiskCapacity()
Gets full disk storage size, in bytes.
Examples
DeviceInfo.getTotalDiskCapacity().then(capacity => {
});
getTotalMemory()
Gets the device total memory, in bytes.
Examples
DeviceInfo.getTotalMemory().then(totalMemory => {
});
getUniqueId()
Gets the device unique ID.
On Android it is currently identical to getAndroidId() in this module
On iOS it uses the DeviceUID uid identifier
On Windows it uses Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation.id
Examples
DeviceInfo.getUniqueId().then(uniqueId => {
});
Notes
- iOS: This is
IDFV
or a random string if IDFV is unavaliable. Once UID is generated it is stored in iOS Keychain and NSUserDefaults. So it would stay the same even if you delete the app or reset IDFV. You can carefully consider it a persistent, cross-install unique ID. It can be changed only in case someone manually override values in Keychain/NSUserDefaults or if Apple would change Keychain and NSUserDefaults implementations.
Beware: The IDFV is calculated using your bundle identifier and thus will be different in app extensions. - android: Prior to Oreo, this id (ANDROID_ID) will always be the same once you set up your phone.
getUsedMemory()
Gets the app memory usage, in bytes.
Examples
DeviceInfo.getUsedMemory().then(usedMemory => {
});
getUserAgent()
Gets the device User Agent.
Examples
DeviceInfo.getUserAgent().then(userAgent => {
});
getVersion()
Gets the application version.
Examples
DeviceInfo.getVersion().then(version => {
});
isAirplaneMode()
Tells if the device is in Airplane Mode.
Examples
DeviceInfo.isAirplaneMode().then(airplaneModeOn => {
});
Notes
- This only works if the remote debugger is disabled.
isBatteryCharging()
Tells if the battery is currently charging.
Examples
DeviceInfo.isBatteryCharging().then(isCharging => {
});
isEmulator()
Tells if the application is running in an emulator.
Examples
DeviceInfo.isEmulator().then(isEmulator => {
});
isPinOrFingerprintSet()
Tells if a PIN number or a fingerprint was set for the device.
Examples
DeviceInfo.isPinOrFingerprintSet().then(isPinOrFingerprintSet => {
if (!isPinOrFingerprintSet) {
}
});
isTablet()
Tells if the device is a tablet.
Examples
DeviceInfo.isTablet().then(isTablet => {
});
isLandscape()
Tells if the device is currently in landscape mode.
Examples
DeviceInfo.isLandscape().then(isLandscape => {
});
hasNotch()
Tells if the device has a notch.
Examples
DeviceInfo.hasNotch().then(hasNotch => {
});
getDeviceType()
Returns the device's type as a string, which will be one of:
Examples
DeviceInfo.getDeviceType(type => {
});
supported32BitAbis()
An ordered list of 32 bit ABIs supported by this device.
Examples
DeviceInfo.supported32BitAbis().then(abis => {
});
supported64BitAbis()
An ordered list of 64 bit ABIs supported by this device.
Examples
DeviceInfo.supported64BitAbis().then(abis => {
});
supportedAbis()
Returns a list of supported processor architecture version
Examples
DeviceInfo.supportedAbis().then(abis => {
});
hasSystemFeature(feature)
Tells if the device has a specific system feature.
Examples
DeviceInfo.hasSystemFeature('amazon.hardware.fire_tv').then(hasFeature => {
});
getSystemAvailableFeatures()
Returns a list of available system features on Android.
Examples
DeviceInfo.getSystemAvailableFeatures().then(features => {
});
isLocationEnabled()
Tells if the device has location services turned off at the device-level (NOT related to app-specific permissions)
Examples
DeviceInfo.isLocationEnabled().then(enabled => {
});
getAvailableLocationProviders()
Returns an object of platform-specfic location providers/servcies, with boolean
value whether or not they are currently available.
NOTE: This function requires access to the Location permission on Android
Android Example
DeviceInfo.getAvailableLocationProviders().then(providers => {
});
iOS Example
DeviceInfo.getAvailableLocationProviders().then(providers => {
});
Events
Currently iOS-only.
RNDeviceInfo_batteryLevelDidChange
Fired when the battery level changes; sent no more frequently than once per minute.
Examples
import { NativeEventEmitter, NativeModules } from 'react-native'
const deviceInfoEmitter = new NativeEventEmitter(NativeModules.RNDeviceInfo)
deviceInfoEmitter.addListener('RNDeviceInfo_batteryLevelDidChange', level => {
});
RNDeviceInfo_batteryLevelIsLow
Fired when the battery drops below 20%.
Examples
import { NativeEventEmitter, NativeModules } from 'react-native'
const deviceInfoEmitter = new NativeEventEmitter(NativeModules.RNDeviceInfo)
deviceInfoEmitter.addListener('RNDeviceInfo_batteryLevelIsLow', level => {
});
RNDeviceInfo_powerStateDidChange
Fired when the battery state changes, for example when the device enters charging mode or is unplugged.
Examples
import { NativeEventEmitter, NativeModules } from 'react-native'
const deviceInfoEmitter = new NativeEventEmitter(NativeModules.RNDeviceInfo)
deviceInfoEmitter.addListener('RNDeviceInfo_powerStateDidChange', { batteryState } => {
});
Troubleshooting
When installing or using react-native-device-info
, you may encounter the following problems:
[android] - Unable to merge dex / Multiple dex files / Problems with `com.google.android.gms`
react-native-device-info
uses com.google.android.gms:play-services-gcm
to provide [getInstance()][#getinstance].
This can lead to conflicts when building the Android application.
If you're using a different version of com.google.android.gms:play-services-gcm
in your app, you can define the
googlePlayServicesVersion
gradle variable in your build.gradle
file to tell react-native-device-info
what version
it should require. See the example project included here for a sample.
If you're using a different library that conflicts with com.google.android.gms:play-services-gcm
, and you are certain you know what you are doing such that you will avoid version conflicts, you can simply
ignore this dependency in your gradle file:
compile(project(':react-native-device-info')) {
exclude group: 'com.google.android.gms'
}
[ios] - ld: library not found for -lRNDeviceInfo-tvOS
Seems to be a bug caused by react-native link
. You can manually delete libRNDeviceInfo-tvOS.a
in Xcode -> [Your iOS build target] -> Build Phrases -> Link Binary with Libraries
.
[ios] - [NetworkInfo] Descriptors query returned error: Error Domain=NSCocoaErrorDomain Code=4099
“The connection to service named com.apple.commcenter.coretelephony.xpc was invalidated.”
This is a system level log that may be turned off by executing:
xcrun simctl spawn booted log config --mode "level:off" --subsystem com.apple.CoreTelephony
.
To undo the command, you can execute:
xcrun simctl spawn booted log config --mode "level:info" --subsystem com.apple.CoreTelephony
[ios] - Multiple versions of React when using CocoaPods
"tries to require 'react-native' but there are several files providing this module"
RN<=59 You may need to adjust your Podfile like this if you use Cocoapods and have undefined symbols or duplicate React definitions
target 'yourTargetName' do
pod 'React', :path => '../node_modules/react-native', :subspecs => [
'Core',
'CxxBridge',
'DevSupport',
'RCTText',
'RCTNetwork',
'RCTWebSocket',
'RCTAnimation',
]
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
pod 'RNDeviceInfo', path: '../node_modules/react-native-device-info'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "React"
target.remove_from_project
end
end
end
[tests] - Cannot run my test suite when using this library
react-native-device-info
contains native code, and needs to be mocked. Jest Snapshot support may work though.
Here's how to do it with jest for example:
"jest": {
"setupFiles": [
"./testenv.js"
],
jest.mock('react-native-device-info', () => {
return {
getModel: jest.fn(),
};
});
[warnings] - I get too many warnings (battery state, etc)
Some of the APIs (like getBatteryState) will throw warnings in certain conditions like on tvOS or the iOS emulator. This won't be visible in production but even in development it may be irritating. It is useful to have the warnings because these devices return no state, and that can be surprising, leading to github support issues. The warnings is intended to educate you as a developer. If the warnings are troublesome you may try this in your code to suppress them:
import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['Battery state']);
Release Notes
See the CHANGELOG.md.
Contributing
Please see the contributing guide
.
react-native-dom
As a courtesy to developers, this library was made compatible in v0.21.6 with react-native-dom and react-native-web by providing an empty polyfill in order to avoid breaking builds.
Only getUserAgent() will return a correct value. All other API methods will return an "empty" value of its documented return type: 0
for numbers, ''
for strings, false
for booleans.