React Native получить состояние батареи / уровень
Я пишу родное приложение react, чтобы получить статус батареи IOS и Android. Я ищу через сеть и нашел несколько библиотек, которые могут получить уровень заряда батареи телефона.
https://github.com/robinpowered/react-native-device-battery
https://github.com/remobile/react-native-battery-status
https://github.com/oojr/react-native-battery
каждая библиотека имеет проблемы, когда я пытаюсь, что и не так много поддержки для разработчика, когда задаете вопрос о Git hub.
может ли кто-нибудь предоставить мне лучшее решение или библиотеку, чтобы получить статус батареи IOS и Android.
спасибо заранее
2 ответов
я написал свои собственные классы IOS и Android, чтобы получить статус батареи. Вот шаги, если кто-то заинтересован в этом,
для IOS,
- откройте проект iOS в XCode
- создать 2 новых файла вызова BatteryStatus.h И BatteryStatus.м
BatteryStatus.H-файл должен содержать следующий код
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule>
@end
BatteryStatus.файл м
#import "BatteryStatus.h"
@implementation BatteryStatus
RCT_EXPORT_MODULE(BatteryStatus)
- (instancetype)init
{
if ((self = [super init])) {
[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
}
return self;
}
RCT_EXPORT_METHOD(hide) {
}
RCT_EXPORT_METHOD(updateBatteryLevel:(RCTResponseSenderBlock)callback)
{
callback(@[[self getBatteryStatus]]);
}
//manually get battery status by calling following method
-(NSDictionary*)getBatteryStatus
{
float batteryLevel = [UIDevice currentDevice].batteryLevel;
NSObject* currentLevel = nil;
currentLevel = [NSNumber numberWithFloat:(batteryLevel * 100)];
NSMutableDictionary* batteryData = [NSMutableDictionary dictionaryWithCapacity:2];
[batteryData setObject:currentLevel forKey:@"level"];
return batteryData;
}
@end
-
внутри вашего родного приложения react, внутри вашего JS-файла добавьте следующий код
import { NativeModules } from 'react-native'; constructor(props) { super(props); this.state = { batteryLevel: null, }; } componentDidMount() { NativeModules.BatteryStatus.updateBatteryLevel((info) => { //console.log(info.level) const level = Math.ceil(info.level); this.setState({ batteryLevel: level}); }); }
для IOS выше код работает для меня, чтобы получить уровень заряда батареи
Для Android
- откройте проект Android в Android Studio
- создайте групповой вызов BatteryStatus и включите 2 файла с именем BatteryStatusModule.java и BatteryStatusPackage.java
BatteryStatusModule.java должен содержать следующее код
package com.yourproject.BatteryStatus;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
public class BatteryStatusModule extends ReactContextBaseJavaModule {
public BatteryStatusModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "BatteryStatus";
}
@ReactMethod
public void getBatteryStatus(Callback successCallback) {
Intent batteryIntent = getCurrentActivity().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
if(level == -1 || scale == -1) {
level = 0;
}
//System.out.print("battery level");
//System.out.print(level);
successCallback.invoke(null ,((float)level / (float)scale) * 100.0f);
}
}
BatteryStatusPackage.java должен содержать следующий код
package com.yourproject.BatteryStatus;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BatteryStatusPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new BatteryStatusModule(reactContext));
return modules;
}
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
-
Внутри MainApplication.в Java включают в себя следующий код
@Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new MapsPackage(), new BatteryStatusPackage() ); }
-
внутри вашего родного приложения react, внутри вашего JS-файла добавьте следующий код
import { NativeModules } from 'react-native'; constructor(props) { super(props); this.state = { batteryLevel: null }; } getBatteryLevel = (callback) => { NativeModules.BatteryStatus.getBatteryStatus(callback); }
6.Назовите это примерно так:
componentDidMount() {
this.getBatteryLevel((batteryLevel) => {
console.log(batteryLevel);
});
}
для Android выше код работает для меня, чтобы получить уровень заряда батареи
надеюсь, что это поможет кому-то получить уровень заряда батареи для IOS и ANDROID
просто некоторое дополнение к правильному ответу. Вы должны переопределить функцию "supportedEvents" в BatteryStatus.файл M, чтобы заставить его работать так :
-(NSArray<NSString *> *)supportedEvents{
return @[@"level"];
}