Flutter插件开发--获取Android手机电池信息
由于我不会做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手机电池信息相关推荐
- android开发获取手机,通过ADB获取Android手机信息,获取手机信息
通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...
- aapt 获取Android版本信息和图标
aapt android开发工具的一个命令行工具. apk android的安装文件 下面是用python脚本获取版本 图标信息.O(∩_∩)O 有个问题呢,但是 ,先记录下. #!/usr/bin/ ...
- iphone adb android,通过ADB获取Android手机信息
1.获取手机体系信息(CPU,厂商名称等) adbshell"cat/system/build.prop|grep"product"" 2.获取手机体系版别 a ...
- 获取Android版本信息和电话信息
Android的版本信息可以通过android.os.Build获得,电话信息可以通过TelephonyManager获得,代码如下: private void get_infor(){ sdk = ...
- FlowDroid + Soot-infoflow-android获取Android apk信息 2.9.0版2021最新版
private static String apkPath = "E:\\ApkTool\\JSQ.apk";public static void main(String[] ar ...
- python获取android手机信息
adb下载:https://pan.baidu.com/s/1miBZJjq 使用脚本前请先将adb.exe文件加入到计算机的环境变量path里面,或者复制到和脚本的同一目录下,手机连接到电脑时请打开 ...
- Flutter获取Android/iOS设备信息
我们在进行各个系统的原生开发时,都有对应的方法获取设备信息,那么在使用Flutter时如何获取设备相关的相关信息呢? 我们本文就来介绍一个Flutter插件: Flutter Device Info ...
- android日历信息获取错误,flutter对android的日历数据相关操作
系统日历 三个不同URL的作用 每个url通过contentProvider能获得对应数据库的访问句柄,所以可以理解三个url对应三个数据库,如果通过一个事件关联3个库呢,下面会详细介绍. 数据库介绍 ...
- 【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )
文章目录 博客简介 . FFMPEG 音视频流 获取流程 I . FFMPEG 获取音视频流信息 ( AVFormatContext 结构体 ) II . FFMPEG 获取 音视频流 数量 III ...
最新文章
- 试用最新版本的live writer发一篇日志看看
- 英巴卡迪诺新年战略:支持Linux提供中文手册
- java对象深入理解
- 享元模式(FlyWeight)
- KMP算法的来龙去脉
- 2020年上半年家电市场报告
- k8s之scheduler
- DELL T420塔式服务器RAID配置及OS安装
- nodeJS---URL相关模块用法(url和querystring)
- 190112每日一句
- UVA 10733 - The Colored Cubes(Ploya)
- 如何免费下载百度文库的文档!!!!!!!
- Jeff Dean的神话
- PostgreSQL 15.0下载与安装详细保姆教程
- 以首尾交换的方法交换字符串中以'A'开头和以'N'结尾的单词
- Lick the habit 戒除恶习
- 第九届中国云计算大会讲师团探秘 ——数位院士领衔、近20个国家的学者共聚、多个行业领头人及专家参与, 共话云计算大数据生态、应用...
- keygen是怎么写出来的。
- 对WXin执行回插入代码后的回编译操作
- 查看网站服务器版本,查看网站为TLS或SSL及其版本