官方源代码:https://github.com/flutter/flutter/tree/master/examples/platform_channel

重点:

MainActivity:

CHARGIN_CHANNEL=samples.flutter.io/charging
EventChannel(flutterView, CHARGIN_CHANNEL).setStreamHandler( : EventChannel.StreamHandler

final var BATTERY_CHANNEL: String = “samples.flutter.io/battery
MethodChannel(flutterView, BATTERY_CHANNEL).setMethodCallHandler(

main:

static const EventChannel eventChannel=
EventChannel(‘samples.flutter.io/charging’);

static const MethodChannel methodChannel=
MethodChannel(‘samples.flutter.io/battery’);

注意:两者必须一致

Mactivity.class

package com.flutter 

import android.content.*
import android.os.BatteryManager
import android.os.Build
import android.os.Bundle

import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity() : FlutterActivity() {

    final var CHARGIN_CHANNEL: String = \"samples.flutter.io/charging\"
    final var BATTERY_CHANNEL: String = \"samples.flutter.io/battery\"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(this)

        //充电监听
        EventChannel(flutterView, CHARGIN_CHANNEL).setStreamHandler(  : EventChannel.StreamHandler {

            lateinit var chargingStateChangeReceiver: BroadcastReceiver
            override fun onListen(p0: Any?, p1: EventChannel.EventSink?) {
                chargingStateChangeReceiver = createChargingStateChangeReceiver(p1!!)
                registerReceiver(chargingStateChangeReceiver,
                        IntentFilter(IntentFilter(Intent.ACTION_BATTERY_CHANGED)))
            }

            override fun onCancel(p0: Any?) {
                unregisterReceiver(chargingStateChangeReceiver)
                chargingStateChangeReceiver = null!!
            }

        })


        //flutter 通过methodChannel.invokeMethod 调用方法
        MethodChannel(flutterView, BATTERY_CHANNEL).setMethodCallHandler(
                  : MethodChannel.MethodCallHandler {
                    //调用结果回调
                    override fun onMethodCall(call: MethodCall?, result: MethodChannel.Result?) {
                        if (call?.method.equals(\"getBatteryLevel\")) {
                            val batteryLevel = getBatteryLevel()
                            if (batteryLevel != -1) {
                                //回调返回结果
                                result?.success(batteryLevel)
                            } else {
                                result?.error(\"UNAVAILABLE\", \"Battery level not available.\", null)

                            }
                        } else {
                            result?.notImplemented();
                        }
                    }

                }
        )

    }

    //获取电池量
    fun getBatteryLevel(): Int {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        } else {
            val intent = ContextWrapper(applicationContext).registerReceiver(
                    null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)
            )
            return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
                    intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
        }
    }

    //获取电池状态
    fun createChargingStateChangeReceiver(events: EventChannel.EventSink): BroadcastReceiver {
        return   : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                val status = intent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1)

                if (status == BatteryManager.BATTERY_STATUS_UNKNOWN) {
                    events.error(\"UN\", \"Charging status un\", null)
                } else {
                    var isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL
                    println(\"status===================>\" + status);
                    events.success(if (isCharging) \"charging\" else \"dischargin\")
                }

            }

        }
    }
}

main

import \'dart:async\';

import \'package:flutter/material.dart\';
import \'package:flutter/services.dart\';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _batteryLevel = \'Battery level: unknown.\';
  String _chargingStatus = \'Battery status: unknown.\';

  static const MethodChannel  methodChannel=
      MethodChannel(\'samples.flutter.io/battery\');
  static const EventChannel eventChannel=
      EventChannel(\'samples.flutter.io/charging\');

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    eventChannel.receiveBroadcastStream().listen(_onEvent, : _ );
  }

  void _onEvent(  event){
    setState(() {
      _chargingStatus=\'Battery status: ${event == \'charging\' ? \'\' :\'dis\'}charging.\';
    });
  }

  void _ (  error){
    setState(() {
      _chargingStatus=\'Battery status: unknown\';
    });
  }


  @override
  Widget build(BuildContext context) {
    return Material(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(_batteryLevel, key: const Key(\'Battery level label\')),
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: RaisedButton(
                  onPressed: _getBatteryLevel,
                  child: const Text(\'Refresh\'),
                ),
              ),
              Text(_chargingStatus)
            ],
          ),
        ],
      ),
    );
  }


  Future<void> _getBatteryLevel() async{

    String batteryLevel;

    //初始化频道
    var result=await methodChannel.invokeMethod(\'getBatteryLevel\');
    batteryLevel=\'battery level look: $result%\';

    setState(() {
      _batteryLevel=batteryLevel;
    });
    
  }
}

\"在这里插入图片描述\"

收藏 打印