一.BlueTooth简介
1.什么是蓝牙
(1)Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通讯的标准。传说瑞典有个国王特别爱吃蓝莓导致自己的牙齿天天都是蓝色的,在他执政期间这位国王非常善于交际,能说会到,和邻国的搞得关系非常好,这个Bluetooth的发明者觉得蓝牙它的作用就是在近距离沟通周围的设备,跟这个国王很类似,于是起名叫蓝牙。
(2)主要针对短距离设备通讯(10米)
(3)无线耳机,无线鼠标,无线键盘
2.蓝牙工作流程图
首先两个设备上都要有蓝牙设备或者专业一点叫蓝牙适配器,以手机和电脑为例的流程图。在手机上进行扫描,扫描周围蓝蓝牙设备,先找到手机附近的电脑,然后给它发出一个信号需要进行蓝牙的配对,再次返回一个信号说明手机和电脑已经配对成功了,最后配对成功后可以进行文件传输了。这是一个最基本的一个流程。
二.BlueTooth基本知识
1.BlueTooth需要用到的权限
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
android.permission.BLUETOOTH:使用蓝牙协议的基本权限呢
android.permission.BLUETOOTH_ADMIN:蓝牙协议的高级权限,程序和其他程序进行配对就必须使用这个权限
2.BlueTooth两个基本的API
BuletoothAdapter:这个类的对象代表了本地的蓝牙适配器,相当于蓝牙工作流程图中的手机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么手机上的蓝牙适配器就是本地蓝牙适配器。
BuletoothDevice:这个类的对象代表了远程的蓝牙设备,相当于蓝牙工作流程图中的计算机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那BuletoothDevice代表了你要连接的远程的那个设备上的蓝牙适配器。
蓝牙在设备上的可用性是什么呢?就是在应用程序能够利用蓝牙通道通信之前,需要确认设备是否支持蓝牙通信,如果支持,要确保它是可用的。如果不支持蓝牙,那么你应该禁用所有蓝牙功能。如果支持蓝牙,但是被禁用的,那么你要在不离开你的应用程序的情况下,请求用户启用蓝牙功能,这种设置要使用BluetoothAdapter对象!所以总结为以下几点:
1. 获得BluetoothAdapter对象并判断本机是否支持蓝牙功能
BluetoothAdapter对象是所有蓝牙活动都需要的,要获得这个对象,就要调用静态的getDefaultAdapter()方法。这个方法会返回一个代表设备自己的蓝牙适配器的BluetoothAdapter对象。整个系统有一个蓝牙适配器,你的应用程序能够使用这个对象来进行交互。如果getDefaultAdapter()方法返回null,那么该设备不支持蓝牙,你的处理也要在此结束。
BluetoothAdapter mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter ==null){
// Device does not support Bluetooth
}
2. 启用蓝牙功能
接下来,需要确保蓝牙是可用的。调用isEnabled()方法来检查当前蓝牙是否可用。如果这个方法返回false,那么蓝牙是被禁用的。要申请启用蓝牙功能,就要调用带有ACTION_REQUEST_ENABLE操作意图的startActivityForResult()方法。它会给系统设置发一个启用蓝牙功能的请求(不终止你的应用程序)。
if(!mBluetoothAdapter.isEnabled()){
Intent enableBtIntent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
简单的实例:
运行的界面:
主界面代码:
package com.liangdianshui.bluetooth; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.liangdianshui.bluetoothutil.BlueToothController; public class MainActivity extends Activity { private static final int REQUEST_CODE = 0; private BlueToothController mBlueToothController = new BlueToothController(); private Toast mToast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mReceiver, filter); } public void isSupportBlueTooth(View view) { boolean ret = mBlueToothController.isSupportBlueTooth(); showToast("support Bluetooth? " + ret); } public void isBlueToothEnable(View view) { boolean ret = mBlueToothController.getBlueToothStatus(); showToast("Bluetooth Enable?" + ret); } public void requestTurnOnBlueTooth(View view) { mBlueToothController.turnOnBlueTooth(this, REQUEST_CODE); } public void turnOffBlueTooth(View view) { mBlueToothController.turnOffBlueTooth(); } public void showToast(String text) { if (mToast != null) { mToast.setText(text); } else { mToast = Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT); } mToast.show(); } /** * 监听蓝牙开关的广播 */ private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); switch (state) { case BluetoothAdapter.STATE_ON: showToast("STATE_ON"); break; case BluetoothAdapter.STATE_OFF: showToast("STATE_OFF"); break; case BluetoothAdapter.STATE_TURNING_ON: showToast("STATE_TURNING_ON"); break; case BluetoothAdapter.STATE_TURNING_OFF: showToast("STATE_TURNING_OFF"); break; default: showToast("Unkown STATE"); break; } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //点击开启蓝牙的按钮时,打开请求界面,然后返回用户选择的结果 if (resultCode == RESULT_OK) { showToast("打开蓝牙成功"); } else { showToast("打开蓝牙失败"); } } @Override protected void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); } }
package com.liangdianshui.bluetoothutil; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.util.Log; /** * 蓝牙适配器 * Created by 两点水 on 2016/3/14. */ public class BlueToothController { private BluetoothAdapter mBluetoothAdapter; public BlueToothController() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } /** * 检查机器是否支持蓝牙 * * @return true 支持蓝牙 false 不支持蓝牙 */ public boolean isSupportBlueTooth() { if (mBluetoothAdapter == null) { return false; } else { return true; } } /** * 获取当前蓝牙的状态 * * @return true 打开 false 关闭 */ public boolean getBlueToothStatus() { assert (mBluetoothAdapter != null);//断言 return mBluetoothAdapter.isEnabled(); } /** * 开启蓝牙 * * @param activity * @param requestCode */ public void turnOnBlueTooth(Activity activity, int requestCode) { //官方推荐打开蓝牙的方法 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); activity.startActivityForResult(intent, requestCode); // mBluetoothAdapter.enable(); } /** * 关闭蓝牙 */ public void turnOffBlueTooth() { mBluetoothAdapter.disable(); } }
4.查找蓝牙设备和绑定蓝牙设备
5.蓝牙设备之间的通讯
蓝牙设备之间的通讯,跟普通的socket之间的通讯差不多!因此,需要一个服务器端和客户端!
(1)创建服务器端的四个步骤
a.通过 创建
b.监听accept
c.处理socket
d.关闭连接
(2)创建客户端的四个步骤
a.通过 创建
b.连接服务器connect
c.处理socket
d.关闭连接