文档章节

Android BLE 蓝牙编程(四)

我辈年轻1
 我辈年轻1
发布于 2016/11/03 19:22
字数 924
阅读 38
收藏 0

接上篇,我们已经实现了短震,长震的功能了~

现在我们需要实现点击后一直震动的功能

开始我的想法是再循环中不断执行write方法,然而这个办法行不通。

系统会报错。

 

那要如何实现这个想法呢?其实很简单,使用service实现轮询就行

那想到了解决方案就着手实现方法吧!!

写个服务:

package com.wbnq.ryadie.service;

import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.app.Service;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;

import com.wbnq.ryadie.HexUtil;
import com.wbnq.ryadie.OfflineApplication;
import com.wbnq.ryadie.R;
import com.wbnq.ryadie.StaticData;
import com.wbnq.ryadie.broadcast.AlarmReceiver;

import java.util.Date;

import static com.wbnq.ryadie.StaticData.GATDATA;
import static com.wbnq.ryadie.StaticData.GATPOWER;

/**
 * Created by guwei on 16-9-20.
 */
public class ReadData extends Service {

    BluetoothGatt bluetoothGatt;
    BluetoothGattCharacteristic bleGattCharacteristic;

    OfflineApplication application;
    boolean isrunning;

    public static final String TAG = "ReadData_service";

    //    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        application = (OfflineApplication) getApplication();

        isrunning = application.getIsthreadrunning();
        //这里开辟一条线程,用来执行具体的逻辑操作:
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("BackService", new Date().toString());
                bleGattCharacteristic = application.getCharacteristic();
                bluetoothGatt = application.getBluetoothGatt();

                if (isrunning) {
                    Log.e(TAG, "run: 开始轮询服务");
                    //向设备发送获取数据的命令
                    write(GATDATA);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //向设备发送获取电量的命令
                    write(GATPOWER);
                } else {
                    Log.e(TAG, "run: 停止轮询服务");

                }
            }
        }).start();

        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
        //这里是定时的,这里设置的是每隔两秒打印一次时间=-=,自己改
        int anHour = 20 * 1000;
        long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
        Intent i = new Intent(this, AlarmReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
        manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
        return super.onStartCommand(intent, flags, startId);
    }

    //向设备写入命令方法
    private void write(String commond) {

        Log.i(TAG, "write: in write \t " + bluetoothGatt + "\t" + bleGattCharacteristic);

        if (bleGattCharacteristic != null && bluetoothGatt != null) {
            bleGattCharacteristic.setValue(HexUtil.hexStringToBytes(commond));
            bluetoothGatt.writeCharacteristic(bleGattCharacteristic);
            commond = null;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy: ");
    }
}
View Code

不过服务里面想要执行写方法需要获取到主Activity下获取过的两个数据:

bleGattCharacteristic

bluetoothGatt

这个要怎么传递过来呢?

其实方法很多,我这里用个简单的

全局变量Application 方法就行。

package com.wbnq.ryadie;

import android.app.Application;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;

/**
 * Created by guwei on 16-9-20.
 */
public class OfflineApplication extends Application {

    private BluetoothGatt bluetoothGatt;
    private BluetoothGattCharacteristic characteristic;


    private Boolean isthreadrunning ;


    @Override
    public void onCreate() {
        super.onCreate();
        setBluetoothGatt(null);
        setCharacteristic(null);
        setIsthreadrunning(false);
    }

    public Boolean getIsthreadrunning() {
        return isthreadrunning;
    }

    public void setIsthreadrunning(Boolean isthreadrunning) {
        this.isthreadrunning = isthreadrunning;
    }

    public BluetoothGatt getBluetoothGatt() {
        return bluetoothGatt;
    }

    public void setBluetoothGatt(BluetoothGatt bluetoothGatt) {
        this.bluetoothGatt = bluetoothGatt;
    }

    public BluetoothGattCharacteristic getCharacteristic() {
        return characteristic;
    }

    public void setCharacteristic(BluetoothGattCharacteristic characteristic) {
        this.characteristic = characteristic;
    }
}
View Code

名字我随便取的

大家可以起个好理解的。

如何设置全局变量呢?也很简单。

首先获取到application:

myapplication = (OfflineApplication) getApplication();

然后设置相应的值:

//设置全局变量的值
                myapplication.setCharacteristic(bleGattCharacteristic);
                myapplication.setBluetoothGatt(bluetoothGatt);

这就是设置。

获取呢?

也很简单:

bleGattCharacteristic = application.getCharacteristic();
 bluetoothGatt = application.getBluetoothGatt();

很简单对吧?

那么我如何开启服务呢?方法也很多。在这里我就使用广播的方式:

广播接收器:

package com.wbnq.ryadie.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.wbnq.ryadie.service.ReadData;

/**
 * Created by guwei on 16-9-20.
 */
public class AlarmReceiver extends BroadcastReceiver {
    String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent ) {
        Intent i = new Intent(context, ReadData.class);
        context.startService(i);


        context.stopService(i);
        Log.e(TAG, "onReceive: onReceive");
    }
}

接收到广播后就调用start方法就好了!很简单对吧~

别忘了想要使用广播,全局变量,服务都是需要注册的。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wbnq.ryadie">

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

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

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


    <application
        android:name=".OfflineApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <service android:name="com.wbnq.ryadie.service.ReadData" />

        <receiver android:name=".broadcast.AlarmReceiver">
            <intent-filter>
                <action android:name="com.guwei.READDATA"/>
            </intent-filter>
        </receiver>
    </application>


</manifest>

最后一步,找对地方发送广播~

sendBroadcast(new Intent("com.guwei.READDATA"));

恭喜你啦,现在你已经可以让你的手环震动到停不下来!~~

哈哈

下节我们来分析下服务的代码吧!

本节写的很仓促,有错的地方欢迎指正!~~

 

本文转载自:http://www.cnblogs.com/wobeinianqing/p/5886756.html

我辈年轻1
粉丝 1
博文 85
码字总数 0
作品 0
南京
程序员
私信 提问
Android获取当前手机蓝牙Mac地址(5.0,6.0-7.0,8.0-9.0) -(进行中),蓝牙电话

注意:当前Android手机5.0,6.0-7.0能获取蓝牙Mac地址;而当前Android手机8.0-9.0蓝牙Mac地址获取不到,API被隐藏的更深了?? Oreo(Android O) 8.0 2017年8月22日 API level 26 Oreo(And...

desaco
01/30
0
0
Android 蓝牙4.0低功耗(BLE)官方详解(译)

声明:转载请注明出处http://www.jianshu.com/p/54bc88207050 Android 4.3(API level 18)引入了蓝牙低功耗(BLE)核心功能,并提供了API可供app来搜索设备,查询服务以及传输信息。 蓝牙低功...

蛇发女妖
2017/11/23
0
0
ym——物联网入口之一Android蓝牙4.0

如果还有同学不知道蓝牙4.0可以做什么请查看Android+蓝牙 4.0 将带来什么?,现在可以穿戴设备也大多用的是蓝牙4.0,如 智能体质秤,智能手环,智能血压计等等。 原文地址:http://develope...

天下杰论
2014/11/13
0
0
android -------- 蓝牙Bluetooth

什么是蓝牙? 也可以说是蓝牙技术。所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,是由爱立信公司公司发明的。利用“蓝牙”技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手...

切切歆语
2018/04/17
0
0
简单链接Simplelink 传感器标签SensorTag

传感器标签现在支持iBeacon技术 为了让你的传感器标签升级到与iBeancon技术兼容,你需要和苹果公司签约一个iBeacon许可,然后你可以请求访问软件,通过点击这里http://www.ti.com/tool/sens...

刘小米
2014/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
19
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部