2017-07-05 4 views
5

Ich schreibe eine native App reagieren, um IOS und Android Batteriestatus zu bekommen. Ich suche im Internet und finde einige Bibliotheken, die den Akkustand des Telefons erreichen können.React Native Get Batterie Status/Level

https://github.com/robinpowered/react-native-device-battery

https://github.com/remobile/react-native-battery-status

https://github.com/oojr/react-native-battery

Jede Bibliothek Probleme hat, wenn ich, dass und nicht viel Unterstützung für die Entwickler versuchen, wenn Sie eine Frage auf git Hub fragen.

Kann mir jemand eine bessere Lösung oder Bibliothek zur Verfügung stellen, um den Batteriestatus von IOS und Android zu erhalten.

Vielen Dank im Voraus

+0

Hallo, ich habe die gleiche Situation gerade jetzt. Hast du es gelöst und eine funktionierende Lösung gefunden? Danke für Ihre Hilfe. – natterstefan

+0

@StefanN. Ich habe eine Antwort auf meine Frage geschrieben –

+0

Ah habe es, das muss ^^ verpasst haben. Eigentlich sieht es so aus, als ob deine Antwort mir helfen würde, herauszufinden, wie man nativen Code mit dem React-Part verbindet und wie man den Akkustand bekommt. Vielen Dank. – natterstefan

Antwort

4

ich meine eigene IOS und Android Klassen schrieb den Batteriestatus zu erhalten. Hier sind die Schritte, wenn eine interessiert daran,

Für IOS,

  1. Öffnen Sie das iOS-Projekt in XCode
  2. erstellen 2 neue Dateien rufen BatteryStatus.h und BatteryStatus.m

BatteryStatus.h Datei sollte

#import <Foundation/Foundation.h> 
#import <React/RCTBridgeModule.h> 
#import <React/RCTEventEmitter.h> 

@interface BatteryStatus : RCTEventEmitter <RCTBridgeModule> 
@end 

BatteryStatus.m Datei enthalten Code folgende

#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 
    sollte
  1. In Ihrem reagiert native App, in Ihrer js Datei hinzufügen Code folgende

    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}); 
        }); 
    } 
    

Für IOS obigen Code ist für mich zu arbeiten erhalten den Batteriestand

Für Android,

  1. Öffnen Sie das Android-Projekt in Android Studio
  2. Erstellen Sie eine Gruppe anrufen Battery und schließen 2 genannten Dateien, BatteryStatusModule.java und BatteryStatusPackage.java

BatteryStatusModule.java Sollte enthalten Code folgende

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 sollte folgenden Code enthalten

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 Hauptanwendung.java umfassen folgende Code

    @Override 
    protected List<ReactPackage> getPackages() { 
        return Arrays.<ReactPackage>asList(
         new MainReactPackage(), 
         new MapsPackage(), 
         new BatteryStatusPackage() 
    ); 
    } 
    
  2. In Ihrem reagieren native App, fügen Sie in Ihrem js Datei Code folgende

    import { NativeModules } from 'react-native'; 
    
    constructor(props) { 
    super(props); 
    
    this.state = { 
        batteryLevel: null 
    }; 
    } 
    
    getBatteryLevel = (callback) => { 
        NativeModules.BatteryStatus.getBatteryStatus(callback); 
    } 
    

6.Call es so etwas wie dieses:

componentDidMount() { 
this.getBatteryLevel((batteryLevel) => { 
    console.log(batteryLevel); 
}); 
} 

Für Android oben Code funktioniert für mich, um den Akku-Level

zu bekommen

Hoffe, dies wird jemand helfen, Batterie-Level für IOS und ANDROID zu bekommen

+0

hervorragend! Vielen Dank! –

1

Nur ein paar zusätzliche auf die richtige Antwort. Sie müssen die 'supportedEvents' Funktion in der BatteryStatus.m Datei überschreiben, damit es wie folgt funktioniert: