美文网首页
Flutter 调用Android原生组件,获取电池电量 最新

Flutter 调用Android原生组件,获取电池电量 最新

作者: 程就人生 | 来源:发表于2021-11-20 23:08 被阅读0次
图片 Flutter虽是跨平台UI框架,也在飞速发展,但是在调用手机系统的一系列功能时,比如地图、相册、蓝牙等等,还需要与平台原生代码交互。今天就来尝试一下如何在Android手机上获取电池电量。Flutter 和 Android 平台原生代码交互,是通过 MethodChannel 进行通信的,两端的通道名称需要保持一致,才能够保证通讯正常。环境说明:
com.android.tools.build:gradle:4.2.1
compileSdkVersion 30
flutter 2.2.2
Android Studio 4.2.2

第一步,Android端原生代码;

import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class MainActivity extends FlutterActivity {

    // 通道名称
    private static final String CHANNEL_NAME = "com.example.flutter.io/battery";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {

        // 1.通道方法的初始化
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME).setMethodCallHandler(
                new MethodCallHandler() {
                    // 2.通道的回调
                    @Override
                    public void onMethodCall(MethodCall call, Result result) {
                        // 回调获取变量的方法
                        if (call.method.equals("getBatteryLevel")) {
                            int batteryLevel = getBatteryLevel();
                            if (batteryLevel != -1) {
                                result.success(batteryLevel);
                            } else {
                                result.error("UNAVAILABLE", "Battery level not available.", null);
                            }
                        } else {
                            result.notImplemented();
                        }
                    }
                });
    }

    // 3.获取电量的原生方法
    private int getBatteryLevel() {
        int batteryLevel = -1;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
            batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
        } else {
            Intent intent = new ContextWrapper(getApplicationContext()).
                    registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
                    intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        }
        return batteryLevel;
    }
}

第二步,Flutter 框架中的调用;

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: '电量获取示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  // - 应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序的所在的宿主(iOS或Android)应用(原生应用)。
  // - 宿主监听平台通道,并接收该消息。然后它会调用该平台的API,并将响应发送回客户端,即应用程序的Flutter部分。
  // Flutter应用程序实际上包括原生代码和Flutter代码两部分
  // 通过通道名称调用原生组件,通道名称和原生组件的通道名称必须保持一致,
  // 1.初始化通道
  static const platform = const MethodChannel('com.example.flutter.io/battery');

  // 默认电量
  String _batteryLevel = '还未获取:';

  // 获取电池电量的异步方法
  Future<Null> _getBatteryLevel() async {
    String batteryLevel;
    try {
      // 2.通过通道调用原生方法
      final int result = await platform.invokeMethod('getBatteryLevel');
      batteryLevel = ' $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "获取电池电量失败: '${e.message}'.";
    }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
                '当前电量为:$_batteryLevel'
            ),
            ElevatedButton(
              onPressed: _getBatteryLevel,
            child: Text("获取电量"),
            ),
          ],
        ),
      ),
    );
  }
}

第三步:测试;

图片

最后总结
这个Demo总体来说,还是非常简单的,没有用到额外的库;在平台原生代码里,flutter已经帮我们封装好了平台通道,我们只需调用即可。从第一张思维导图中可以看出,第三方插件的调用,还是脱离不了原生的对接。写好了这个简易的demo,第三方对接又近了一小步。

相关文章

网友评论

      本文标题:Flutter 调用Android原生组件,获取电池电量 最新

      本文链接:https://www.haomeiwen.com/subject/hexptrtx.html