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,

  1. откройте проект iOS в XCode
  2. создать 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
  1. внутри вашего родного приложения 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

  1. откройте проект Android в Android Studio
  2. создайте групповой вызов 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();
}
}
  1. Внутри MainApplication.в Java включают в себя следующий код

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
            new MapsPackage(),
            new BatteryStatusPackage()
      );
    }
    
  2. внутри вашего родного приложения 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"];
}