如何在Ionic 4 / Angular + Cordova应用程序中访问当前电池状态?

时间:2019-07-13 10:58:55

标签: cordova cordova-plugins ionic4 battery

目标

我想在Ionic 4 / Angular + Cordova应用程序中访问当前电池状态。

我尝试过的

我在干净的空白Ionic 4应用程序上遵循了https://ionicframework.com/docs/native/battery-status的说明。

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { BatteryStatus } from '@ionic-native/battery-status/ngx';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';

@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
  providers: [
    StatusBar,
    SplashScreen,
    BatteryStatus,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

home.page.ts

import { Component } from '@angular/core';
import { BatteryStatus } from '@ionic-native/battery-status/ngx';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss']
})
export class HomePage {
  constructor(private batteryStatus: BatteryStatus) {
    // watch change in battery status
    const subscription = this.batteryStatus.onChange().subscribe(status => {
      console.log(status.level, status.isPlugged);
    });
  }
}

问题

可悲的是,我总是遇到以下错误,有人知道我在做什么错吗?

Error

ERROR TypeError: Invalid event target
    at setupSubscription (fromEvent.js:50)
    at Observable._subscribe (fromEvent.js:24)
    at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (Observable.js:43)
    at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:29)
    at new HomePage (home.page.ts:12)
    at createClass (core.js:22150)
    at createDirectiveInstance (core.js:22029)
    at createViewNodes (core.js:23255)
    at createRootView (core.js:23169)
    at callWithDebugContext (core.js:24177)

2 个答案:

答案 0 :(得分:0)

代码看起来正确。

您可能遇到的问题是Battery Status API已过时。

我认为,基本上它被跟踪工具所滥用,因为它可以很容易地与其他技术结合以对用户进行数字指纹识别:

  

已过时

     

该功能已过时。尽管它可能在某些浏览器中仍然可以使用,但不建议使用它,因为可以随时将其删除。尝试避免使用它。

答案 1 :(得分:0)

@rtpHarry

感谢您的回复!但是我认为是其他原因导致了这个问题。

据我了解,只有cordova-plugin-battery-status的Web集成使用的是您提到的过时的API。并且iOS和Android实施应使用与iOS或Android的本地连接。

关于过时的电池状态API-Web API | MDN,实际上至少在目前,它可以在Chrome,Android Webview和Android版Chrome上运行。

如果我只是想实现Android的电池状态,这对我来说是有效的:

    let windowNavigator: any;
    windowNavigator = window.navigator;
    windowNavigator.getBattery().then(battery => {
      console.log(battery.level);
      battery.addEventListener('levelchange', function() {
        console.log(this.level);
      });
    });

但是我想使用插件,而不是过时的Battery Status API。因此,如果有人知道发生错误的情况

Invalid event target
    at setupSubscription (fromEvent.js:50)
    at Observable._subscribe (fromEvent.js:24)

我很想听听。 ?