热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flutter插件开发学习之旅(3)检测蓝牙状态和打开蓝牙实战

检测蓝牙状态和打开蓝牙实战前言准备工具实战开始前言经过上二篇的学习,大家基本上应该明白flutter插件开发的基本流程。这篇博客就来一次实战吧,我曾经百度过,还没有关于蓝牙的插件。

检测蓝牙状态和打开蓝牙实战

  • 前言
  • 准备工具
  • 实战开始
前言

经过上二篇的学习,大家基本上应该明白flutter插件开发的基本流程。这篇博客就来一次实战吧,我曾经百度过,还没有关于蓝牙的插件。但是我们开发关于蓝牙的项目,就研究了flutter调用原生蓝牙api,在这个给大家分享一下。

准备工具

这套课程是采用Android Studio进行开发的。当前在此之前请准备好Flutter开发环境,我这里就不进行讲解了

实战开始

lib/main.dart添加一个调用原生方法

///////////Flutter 调用原生 Start//////////////
//这里的参数名要和底层原生的申明的参数名一样
static const MethodChannel methodChannel=
MethodChannel('samples.flutter.io/bluetooth');
Future<void> _openBlueTooth()async{ //打开蓝牙
String message;
message=await methodChannel.invokeMethod('openBuleTooth');
setState(() {
_message=message;
});
}
Future<void> _getBlueTooth()async{ //检测蓝牙
String message;
message=await methodChannel.invokeMethod('getBuleTooth');
setState(() {
_message=message;
});
}
//////// Flutter 调用原生 End ////////

底层原生编写


public class MainActivity extends FlutterActivity {

//申明方法名
private static final String BLUETOOTH_CHANNEL="samples.flutter.io/bluetooth";
private BluetoothManager bluetoothManager = null; //初始化
private BluetoothAdapter bluetoothAdapter = null; //蓝牙适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(),BLUETOOTH_CHANNEL).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if(methodCall.method.equals("openBuleTooth")){ //判断flutter调用那个方法
if(supportBuleTooth()){ //检测真机是否支持蓝牙
openBuleTooth(); //打开蓝牙
result.success("蓝牙已经被开启");
}else{
result.error("设备不支持蓝牙",null,null);
}
}
else if(methodCall.method.equals("getBuleTooth")){
if(supportBuleTooth()){
if(disabled()){ //检测蓝牙的状态
result.success("蓝牙已经开启");
}else{
result.success("蓝牙未开启");
}
}
}
}
}
);
}
//是否支持蓝牙
private boolean supportBuleTooth(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
bluetoothManager=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
bluetoothAdapter=bluetoothManager.getAdapter();
}
if (bluetoothAdapter==null){ //不支持蓝牙
return false;
}
return true;
}
//打开蓝牙
private void openBuleTooth(){
//判断蓝牙是否开启
Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,1);
}
//判断蓝牙是否已经开启
private boolean disabled(){
if(bluetoothAdapter.isEnabled()){
return true;
}
return false;
}
}

下面就是进行简单的布局

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: new Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('蓝牙状态:'),
Text(
_message,
)
],
),
Padding(
padding: EdgeInsets.all(10.0),
child:Column(
children: <Widget>[
RaisedButton(
color: Colors.blue,
textColor: Colors.white,
child: Text('打开蓝牙'),
onPressed: _openBlueTooth,
),
RaisedButton(
color: Colors.blue,
textColor: Colors.white,
child: Text('检测蓝牙状态'),
onPressed: _getBlueTooth,
),
],
)
)
],
)
],
),
),
);
}

完整的代码已经传到我的github上面,大家可以到https://github.com/1144075799/flutter_bluetooth 下载源码观看,可以的话,给一个star。这个项目还会继续完善下去…


推荐阅读
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 传统上,Java 的 String 类一直使用 char 数组来存储字符数据。然而,在 Java 9 及更高版本中,String 类的内部实现改为使用 byte 数组。本文将探讨这一变化的原因及其带来的好处。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
author-avatar
拍友2502878393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有