最近在研究这个,等我有时间来写吧!

终于在端午节给自己放个假,现在就来说说关于android蓝牙ble的

最近的学习成果吧!!

需要材料(写个简单教程吧~~关于小米手环的哦!嘿嘿)

Android 手机一部 要求android 4.3 系统以上

小米手环一个 一代最好 (我手里只有一代的 , 二代有没有修改uuid 我不清楚)

首先说明想要使用android做蓝牙ble的开发首先需要Android 4.3以上的系统哦!这个应该不难,目前大部分Android手机都比这个版本高吧

下面就让我们开始吧~

首先先了解下基础知识!看看系统先帮我们做好了那些事情吧!~

上图!!

这些是Android 系统为我们做的事

首先看BluetoothAdapter

这是系统提供的蓝牙适配器。在使用手机的蓝牙功能前一定是要先获取的。

该适配器提供了一个扫描方法( bluetoothAdapter.startLeScan(callback) ),可以用它来获取蓝牙设备。是不是很贴心啊~~

扫描完设备之后 回调方法中会得到扫描到的设备信息放在bluetoothdevice中

选择我们需要的设备后可以通过 bluetoothdevice的connectGatt方法连接设备。

哎呀~说的太复杂。还是在项目里说明吧!

先布局:

就简单的做成这样的。

小米手环有震动 和计步的功能,我们就在下面展示下计步和电池电量。

主要玩它的震动功能~嘿嘿~~~

简单的写个线性布局。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wbnq.shouhuan.MainActivity"> <Button
android:id="@+id/saomiao"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="扫描设备"/>
<Button
android:id="@+id/zhendong"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="短震 / 嘿嘿嘿"/>
<Button
android:id="@+id/changzhen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="长震 / 呵呵呵"/>
<Button
android:id="@+id/buting"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="不要停 / 哈哈哈"/>
<Button
android:id="@+id/tingxia"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停下来 / ~~"/> <TextView
android:id="@+id/jibu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="走了多少步:"
android:gravity="center"
android:textSize="20dp"/> <TextView
android:id="@+id/dianliang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="电池电量"
android:gravity="center"
android:textSize="20dp"/> <TextView
android:id="@+id/lianjiezhuangtai"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="连接状态:未连接"
android:gravity="center"
android:textSize="20dp"/> </LinearLayout>

正戏来啦:

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button saomiao , duanzhen , changzhen , buting , tingxia;
private TextView jibu , dianliang , lianjiezhuangtai; BluetoothAdapter bluetoothAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView(); //蓝牙管理,这是系统服务可以通过getSystemService(BLUETOOTH_SERVICE)的方法获取实例
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
//通过蓝牙管理实例获取适配器,然后通过扫描方法(scan)获取设备(device)
bluetoothAdapter = bluetoothManager.getAdapter(); } private void initView() {
saomiao = (Button) findViewById(R.id.saomiao);
duanzhen = (Button) findViewById(R.id.zhendong);
changzhen = (Button) findViewById(R.id.changzhen);
buting = (Button) findViewById(R.id.buting);
tingxia = (Button) findViewById(R.id.tingxia); jibu = (TextView) findViewById(R.id.jibu);
dianliang = (TextView) findViewById(R.id.dianliang);
lianjiezhuangtai = (TextView) findViewById(R.id.lianjiezhuangtai); } @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.saomiao: break;
case R.id.zhendong: break;
case R.id.changzhen: break;
case R.id.buting: break;
case R.id.tingxia: break; }
}
}

这个是基本框架。

我们看到在onCreate方法中 我们获取了

BluetoothManager实例,并通过该实例获取了系统的蓝牙适配器
bluetoothAdapter
        //蓝牙管理,这是系统服务可以通过getSystemService(BLUETOOTH_SERVICE)的方法获取实例
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
//通过蓝牙管理实例获取适配器,然后通过扫描方法(scan)获取设备(device)
bluetoothAdapter = bluetoothManager.getAdapter();

另外,想要正常执行的话还需要添加必须的权限:(目前需要的,后面还会加入新权限)

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

下面我们来实现扫描方法吧!

首先,想要实现扫描功能自然要先打开蓝牙啦!!

请求开启蓝牙的代码:

//开始扫描前开启蓝牙
Intent turn_on = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turn_on, 0);
Toast.makeText(MainActivity.this, "蓝牙已经开启", Toast.LENGTH_SHORT).show();

因为扫描是个耗时操作,所以最好把它写在线程当中:

Thread scanThread = new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG", "run: saomiao ...");
saomiao();
}
});

扫描方法:

public void saomiao(){
deviceList.clear();
bluetoothAdapter.startLeScan(callback);
}

代码很简单是吧!的确~

deviceList是个bluetoothdevice的数组(List<BluetoothDevice> deviceList = new ArrayList<>();)

用来存放扫描来的所有device。用之前当然要先清理(clear)一下啦~

然后使用 bluetoothAdapter提供的扫描方法扫描蓝牙ble设备(这里当然就是小米手环啦)

扫描方法有个回调:

//扫描回调
public BluetoothAdapter.LeScanCallback callback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, int i, byte[] bytes) {
Log.i("TAG", "onLeScan: " + bluetoothDevice.getName() + "/t" + bluetoothDevice.getAddress() + "/t" + bluetoothDevice.getBondState()); //重复过滤方法,列表中包含不该设备才加入列表中,并刷新列表
if (!deviceList.contains(bluetoothDevice)) {
//将设备加入列表数据中
deviceList.add(bluetoothDevice);
} }
};

将前面扫描到的数据放进deviceList列表中。

这里如果直接运行的话肯定会弹出个要获取位置的错误。不多说

为项目添加位置权限:

    <!-- Android6.0 蓝牙扫描才需要-->
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

为啥要位置权限我也不清楚。还需要研究呢。

现在已经可以扫描咯!

看看都扫描到那些设备把:

千万别以为我有那么多蓝牙设备哦!其实仔细看原来只有两个~~

没错~一个是手环另一个是其他蓝牙ble设备,为啥会出来这么多呢?

因为每个开着的蓝牙ble设备一直都在以固定的频率发出服务(例如1s/1次)以便手机搜索到该设备

所以这个扫描我们才要写进线程里啊~~

那如何停止扫描呢?很简单哦!

开启扫描的方法记得么?

 bluetoothAdapter.startLeScan(callback);

关闭的方法基本一样,系统也提供了对应的停止方法:

 bluetoothAdapter.stopLeScan(callback);

很方便吧?

下一节我们让设备在手机上以列表形式显示出来吧~~

大家加油啦~~~

android 系统调用shell脚本

Android BLE 蓝牙编程(一)的更多相关文章

  1. Android BLE 蓝牙编程(三)

    上节我们已经可以连接上蓝牙设备了. 本节我们就要获取手环的电池电量和计步啦. 在介绍这个之前我们需要先了解下什么是 服务 什么是 UUID 我们记得上节中我们item监听事件的回调的返回值是Bluet ...

  2. Android BLE 蓝牙编程(四)

    接上篇,我们已经实现了短震,长震的功能了- 现在我们需要实现点击后一直震动的功能 开始我的想法是再循环中不断执行write方法,然而这个办法行不通. 系统会报错. 那要如何实现这个想法呢?其实很简单, ...

  3. Android BLE 蓝牙编程(二)

    大家中秋快乐啊--哈哈,今天继续工程项目吧! 上篇我们已经实现了蓝牙设备的扫描,本篇我们来通过list展示扫描到的设备并 实现点击连接. 先贴出上篇的完整的MainActivity的方法: packa ...

  4. Android ble 蓝牙4.0 总结

    本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...

  5. Android ble 蓝牙4.0 总结一

    本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...

  6. Android BLE蓝牙详细解读

    代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...

  7. 蓝牙防丢器原理、实现与Android BLE接口编程

    本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...

  8. [yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程

    本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...

  9. android ble蓝牙开发略解

    Android 蓝牙4.0开发 1.  权限和相关属性 “android:required="true"表示apk只有在具有bluetooth_le属性的系统里运行,这个4.3之前 ...

随机推荐

  1. iOS __block 与 __weak

    关于__block 与__weak http://stackoverflow.com/questions/19227982/using-block-and-weak 一下是一些区别的介绍 MRC: _ ...

  2. MySQL Nested-Loop Join算法学习

    不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...

  3. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  4. Tips for Planning Your Business Startup

    原文链接:http://domaintree.me/?p=1037 By Robert Thibodeau –  Starting a business can be a very daunting ...

  5. x01.Weiqi.9: 点目功能

    添加点目功能,虽不中,不远也.还是先看看截图吧. 确保其可行,再看一张: 其点目结果,还是比较令人满意的.这主要得益于多遍扫描,如编译器的词法分析阶段,下面的代码可以证明: private void ...

  6. [WPF系列] 高级 调试

    调试工具   ImageBrush出现TypeConverter问题 'Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExt ...

  7. FineReport中hadoop,hive数据库连接解决方案

    1. 描述 Hadoop是个很流行的分布式计算解决方案,Hive是基于hadoop的数据分析工具.一般来说我们对Hive的操作都是通过cli来进行,也就是Linux的控制台,但是,这样做本质上是每个连 ...

  8. 我的第一篇博客/markdown

    开通了博客园 使用markdowm Q:为什么考虑使用markdowm而非别的编辑器? 首先,markdowm的优点就不说了, 我是通过http://sspai.com/25137了解了markdow ...

  9. faster_rcnn c++版本的 caffe 封装(1)

    转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 由于需要把FasterRCNN做的工程化,因此这里需要对Caff ...

  10. python3 下的文件输入输出特性以及如何覆盖文件内容和接下去输入

    今天碰到了一个非常有意思的python特性.本来我是想打开一个文件,在文件的末尾接下去输入一些内容的,代码如下: f = open('test.txt', 'r+') f.write(content) ...