由于我不会做IOS开发,文章里面没有IOS的代码。下面的参考教程里有具体的IOS代码
参考教程:flutter中文网–Flutter实战–插件开发,平台介绍和实现Android端API

 最后的执行效果如下:

平台通道

 平台指的是flutter运行的平台,如Android或者ios,可以认为就是应用的原生部分,所以,平台通道正是Flutter和原生之间通信的桥梁,它也是Flutter插件的底层基础设施。

 Flutter使用了一个灵活的系统,允许调用特定平台的API,无论在Android上的Java或者Kotlin代码中,还是在IOS上的OC或者swift代码中均可用。

 Flutter与原生之间的通信依赖灵活的消息传递方式:

  • 应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序所在的宿主(IOS或者Android)应用(原生应用)
  • 宿主监听平台通道,并接受该消息,然后它会调用该平台的API,并将响应发送回客户端,即应用程序的Flutter部分。

 使用平台通道在Flutter(client)和原生(host)之间传递消息,如下图所示:

 当在Flutter中调用原生方法时,调用信息通过平台通道传递到原生,原生收到调用信息后可以执行指定的操作,如果需要返回数据,则原生会将数据再通过平台通道传递给Flutter,需要注意的是消息的传递是异步的,这确保了用户界面再消息传递时不会被挂起。

 在客户端,MethodChannel API可以发送与方法调用相对应的消息,在宿主平台上,MethodChannel在Android API和FlutterMethodChannel IOS API可以接收方法调用并返回结果,这些类可以帮助我们用很少的代码就能开发平台插件。

 如果需要,方法调用(消息传递)可以是反向的,即宿主作为客户端调用Dart中实现的API,quick_actions插件就可以这么做。

开发Flutter插件

 使用平台通道调用原生代码

 下面是一个获取电池电量的插件,该插件在Dart中通过getBatteryLevel调用Android BatteryManager API和IOS的相关API。

 Flutter中的代码如下:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';/*** 插件开发--获取宿主平台的电量信息*/class BetteryInfoPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("插件开发--获取电量",style: TextStyle(color: Colors.greenAccent,),maxLines: 1,overflow: TextOverflow.ellipsis,),elevation: 0.0,backgroundColor: Colors.lime,),body: BetteryInfoRoute(),);}
}class BetteryInfoRoute extends StatefulWidget {@override_BetteryInfoRouteState createState() {return _BetteryInfoRouteState();}
}class _BetteryInfoRouteState extends State with SingleTickerProviderStateMixin {static const platform = const MethodChannel("samples.flutter.io/battery");//默认电量100%double _currentBetteryInfo = 100;//当前的文字颜色,根据不同的电量改变Color _betteryColor = Colors.greenAccent;//动画控制器AnimationController _animationController;//动画Animation _animation;//显示当前获取电量的状态信息String _currentState = "正在获取信息";@overridevoid initState() {// TODO: implement initStatesuper.initState();setBatteryColor();getValueColorAnimation();_getBatteryLevel();}@overrideWidget build(BuildContext context) {//一个圆形进度条中间显示电量的百分比return Center(child: Stack(alignment: Alignment.center,children: <Widget>[Container(constraints: BoxConstraints.expand(width: 120.0, height: 120.0),child: CircularProgressIndicator(backgroundColor: Colors.redAccent,valueColor: _animation,value: _currentBetteryInfo / 100,),),Padding(padding: EdgeInsets.all(10.0),child: Text(_currentState,style: TextStyle(color: _betteryColor,),),),],),);}//设置动画void getValueColorAnimation() {if (_animationController == null) {_animationController =AnimationController(duration: Duration(seconds: 5), vsync: this);}_animation =CurvedAnimation(parent: _animationController, curve: Curves.ease);_animation = Tween(begin: _betteryColor, end: Colors.greenAccent).animate(_animation);}//设置不同电量的颜色void setBatteryColor() {if (_currentBetteryInfo > 80) {_betteryColor = Colors.greenAccent;} else if (_currentBetteryInfo > 50) {_betteryColor = Colors.orangeAccent;} else {_betteryColor = Colors.redAccent;}}//获取电量Future<Null> _getBatteryLevel() async {try {_currentBetteryInfo = await platform.invokeMethod("getBatteryLevel");_currentState = "${_currentBetteryInfo.toString()}%";} on PlatformException catch (e) {//出现异常_currentState = "failed";} finally {//最终都会执行刷新操作setState(() {setBatteryColor();getValueColorAnimation();});}}
}

//Android中的代码如下:

package com.example.basicwidgetdemo1;import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Bundle;import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;public class MainActivity extends FlutterActivity {private static final String CHANNEL = "samples.flutter.io/battery";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GeneratedPluginRegistrant.registerWith(this);new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(new MethodChannel.MethodCallHandler() {@Overridepublic void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {if(methodCall.method.equals("getBatteryLevel")){double batteryLevel = getBatteryLevel();if(batteryLevel != -1){result.success(batteryLevel);}else{result.error("UNAVAILABLE","Battery level not available",null);}}else{result.notImplemented();}}});}//获取手机剩余电量private double getBatteryLevel(){double battery = -1;if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){BatteryManager manager = (BatteryManager) getSystemService(BATTERY_SERVICE);battery = manager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);}else{Intent intent = new ContextWrapper(getApplicationContext()).registerReceiver(null,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));battery = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,-1) / intent.getIntExtra(BatteryManager.EXTRA_SCALE,-1);}return battery;}
}

Flutter插件开发--获取Android手机电池信息相关推荐

  1. android开发获取手机,通过ADB获取Android手机信息,获取手机信息

    通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...

  2. aapt 获取Android版本信息和图标

    aapt android开发工具的一个命令行工具. apk android的安装文件 下面是用python脚本获取版本 图标信息.O(∩_∩)O 有个问题呢,但是 ,先记录下. #!/usr/bin/ ...

  3. iphone adb android,通过ADB获取Android手机信息

    1.获取手机体系信息(CPU,厂商名称等) adbshell"cat/system/build.prop|grep"product"" 2.获取手机体系版别 a ...

  4. 获取Android版本信息和电话信息

    Android的版本信息可以通过android.os.Build获得,电话信息可以通过TelephonyManager获得,代码如下: private void get_infor(){ sdk = ...

  5. FlowDroid + Soot-infoflow-android获取Android apk信息 2.9.0版2021最新版

    private static String apkPath = "E:\\ApkTool\\JSQ.apk";public static void main(String[] ar ...

  6. python获取android手机信息

    adb下载:https://pan.baidu.com/s/1miBZJjq 使用脚本前请先将adb.exe文件加入到计算机的环境变量path里面,或者复制到和脚本的同一目录下,手机连接到电脑时请打开 ...

  7. Flutter获取Android/iOS设备信息

    我们在进行各个系统的原生开发时,都有对应的方法获取设备信息,那么在使用Flutter时如何获取设备相关的相关信息呢? 我们本文就来介绍一个Flutter插件: Flutter Device Info ...

  8. android日历信息获取错误,flutter对android的日历数据相关操作

    系统日历 三个不同URL的作用 每个url通过contentProvider能获得对应数据库的访问句柄,所以可以理解三个url对应三个数据库,如果通过一个事件关联3个库呢,下面会详细介绍. 数据库介绍 ...

  9. 【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )

    文章目录 博客简介 . FFMPEG 音视频流 获取流程 I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 ) II . FFMPEG 获取 音视频流 数量 III ...

最新文章

  1. 试用最新版本的live writer发一篇日志看看
  2. 英巴卡迪诺新年战略:支持Linux提供中文手册
  3. java对象深入理解
  4. 享元模式(FlyWeight)
  5. KMP算法的来龙去脉
  6. 2020年上半年家电市场报告
  7. k8s之scheduler
  8. DELL T420塔式服务器RAID配置及OS安装
  9. nodeJS---URL相关模块用法(url和querystring)
  10. 190112每日一句
  11. UVA 10733 - The Colored Cubes(Ploya)
  12. 如何免费下载百度文库的文档!!!!!!!
  13. Jeff Dean的神话
  14. PostgreSQL 15.0下载与安装详细保姆教程
  15. 以首尾交换的方法交换字符串中以'A'开头和以'N'结尾的单词
  16. Lick the habit 戒除恶习
  17. 第九届中国云计算大会讲师团探秘 ——数位院士领衔、近20个国家的学者共聚、多个行业领头人及专家参与, 共话云计算大数据生态、应用...
  18. keygen是怎么写出来的。
  19. 对WXin执行回插入代码后的回编译操作
  20. 查看网站服务器版本,查看网站为TLS或SSL及其版本

热门文章

  1. 计算机组成原理学习 笔记三
  2. 物理学/数学中常用的“等号”
  3. 数学基础知识总结 —— 9. 什么是拉格朗日乘数法(Lagrange Multiplier,有约束条件的多元函数求极值)
  4. QT的OpenGL进行模型的3D展示
  5. Understanding Vertica Epochs
  6. 【开发经验】java代码中实现限流
  7. express+socket.io 共享session
  8. 考研复试之路:不努力怎敢轻易言弃
  9. 机器视觉方向的大牛介绍
  10. 物理机安装esxi系统