反应本机 使用本机模块获取电池状态/电量



我正在编写一个反应原生应用程序来获取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的电池状态。

提前致谢

我编写了自己的IOS和Android类来获取电池状态。如果有人对此感兴趣,请按照以下步骤操作,

对于 IOS,

  1. 在 XCode 中打开 iOS 项目
  2. 创建 2 个新文件,分别调用 BatteryStatus.h 和 BatteryStatus.m

BatteryStatus.h 文件应包含以下代码

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule>
@end

电池状态.m 文件应

#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. 在你的反应原生应用程序中,在你的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,上面的代码正在为我工作以获取电池电量

对于安卓,

  1. 在 Android Studio 中打开 Android 项目
  2. 创建一个组呼叫电池状态,并包含 2 个名为 、电池状态模块.java 和电池状态包的文件.java

电池状态模块.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);
}
}

电池状态包.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. Inside MainApplication.java 包含以下代码

    @Override
    protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
    new MainReactPackage(),
    new MapsPackage(),
    new BatteryStatusPackage()
    );
    }
    
  2. 在你的
  3. 反应原生应用程序中,在你的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的电池电量

我们可以使用 react-native-device-info 来获取任何设备的特定信息。

使用命令安装

npm install --save react-native-device-info
# or
yarn add react-native-device-info

获取设备的电池电量,作为由 0 到 1 之间的浮点数组成

,并带有getBatteryLevel()
DeviceInfo.getBatteryLevel().then(batteryLevel => {
console.log(batteryLevel);
// 0.759999
});

注意:

在 iOS 模拟器上返回-1

只是对正确答案的一些补充。您必须覆盖 BatteryStatus.m 文件中的"支持事件"函数才能使其像这样工作:

-(NSArray<NSString *> *)supportedEvents{ 
return @[@"level"];
}

最新更新