美文网首页
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