首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用本机模块响应本机获取电池状态/级别

使用本机模块响应本机获取电池状态/级别
EN

Stack Overflow用户
提问于 2017-07-05 08:00:51
回答 3查看 8.4K关注 0票数 10

我正在编写一个反应本地应用程序,以获得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问题时,对开发人员的支持就不多了。

有谁能为我提供更好的解决方案或库来获取IOS和Android的电池状态?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-16 11:48:24

我编写了自己的IOS和Android类以获得电池状态。如果有人对此感兴趣,请看下面的步骤,

对于IOS来说,

  1. 在iOS中打开XCode项目
  2. 创建两个名为BatteryStatus.h和BatteryStatus.m的新文件

H文件应该包含以下代码

代码语言:javascript
运行
复制
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule>
@end

BatteryStatus.m文件应该

代码语言:javascript
运行
复制
#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文件中添加以下代码 从‘react本机’导入{ NativeModules };构造函数(支持){ super(props);this.state ={ batteryLevel: null,};} componentDidMount() {componentDidMount => {//控制台(info.level) const level = Math.ceil(info.level);this.setState({ batteryLevel: level};});}

对于上面的IOS,代码正在为我提供电池级别。

对于安卓来说,

  1. 在Android中打开Android项目
  2. 创建一个组调用BatteryStatus并包含两个名为BatteryStatusModule.java和BatteryStatusPackage.java的文件

BatteryStatusModule.java应该包含以下代码

代码语言:javascript
运行
复制
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应该包含以下代码

代码语言:javascript
运行
复制
 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内部包括以下代码 @重写受保护的列表getPackages() {返回Arrays.asList(新的MainReactPackage()、新的MapsPackage()、新的BatteryStatusPackage() );}
  2. 在您的react本机应用程序中,在js文件中添加以下代码 从‘react本机’导入{ NativeModules };构造器(支持){超级(支持);this.state ={ batteryLevel: null };} getBatteryLevel =(回调) => {getBatteryLevel}

6.将其称为:

代码语言:javascript
运行
复制
componentDidMount() {
 this.getBatteryLevel((batteryLevel) => {
   console.log(batteryLevel);
 });
}

对于Android,上面的代码正在为我获得电池级别而工作。

希望这能帮助一些人获得IOS和ANDROID的电池水平。

票数 11
EN

Stack Overflow用户

发布于 2018-10-30 11:48:06

我们可以使用反应-本机-信息获取任何设备的特定信息。

用命令安装

代码语言:javascript
运行
复制
npm install --save react-native-device-info
# or
yarn add react-native-device-info

获取设备的电池电平,作为一个浮点,由0到1之间的getBatteryLevel()组成。

代码语言:javascript
运行
复制
DeviceInfo.getBatteryLevel().then(batteryLevel => {
    console.log(batteryLevel);
    // 0.759999
});

注:

-1模拟器上返回iOS

票数 5
EN

Stack Overflow用户

发布于 2018-01-30 23:59:36

只是对正确答案的补充。必须重写BatteryStatus.m文件中的“supportedEvents”函数,才能使其工作如下:

代码语言:javascript
运行
复制
-(NSArray<NSString *> *)supportedEvents{ 
  return @[@"level"];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44920299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档