首先,在开始前我们需要准备好一部手机而不是模拟器(因为模拟器上没有蓝牙装置),且手机已经打开调试模式并连接到电脑上。文中的本地设备均指我们自己的手机,而远程设备则是指其他的设备(电脑、其他手机或者其他)。
其次,要操作设备上的蓝牙装置,需要在AndroidManifest中声明两个权限:
第一个权限称为“蓝牙管理”,是对蓝牙的可见性设置,扫描装置,关闭等操作所设置的
第二个权限是普通的“蓝牙操作权限”,可以操作对蓝牙的打开,搜索配对设备等操作
通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。
1.蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备。
cancelDiscovery()——取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作。
disable()——关闭蓝牙设备。
enable()——直接蓝牙设备,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,下面这两行代码同样是打开蓝牙,不过会提示用户:
getAddress()——获取蓝牙设备的MAC地址。
getDefaultAdapter()——获取本地的蓝牙设备(默认BluetoothAdapter),实际上,也只有这一种方法获取BluetoothAdapter
getName()——获取本地蓝牙的名称
listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServer Socket,这是创建BluetoothSocket服务器端的第一步
startDiscovery()——蓝牙设备开始搜索周边设备
其次,要操作设备上的蓝牙装置,需要在AndroidManifest中声明两个权限:
第一个权限称为“蓝牙管理”,是对蓝牙的可见性设置,扫描装置,关闭等操作所设置的
第二个权限是普通的“蓝牙操作权限”,可以操作对蓝牙的打开,搜索配对设备等操作
<span style="font-size:14px;"><uses-permission android:name="android.permission.BLUETOOTH" >
</uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" >
</uses-permission></span>
通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。
1.蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备。
BluetoothAdapter——本地设备,也就是本地蓝牙适配器。该类主要用来操作蓝牙的基本服务。
比如:初始化设备的可见,查询可匹配的设备集,使用一个已知的MAC地址来初始化一个BluetoothDevice类(远程蓝牙装置),创建一个BluetoothServerSocket类以监听其它设备对本机的连接请求等。
对蓝牙操作首先就需要有一个BluetoothAdapter实例。常用的几个方法如下:cancelDiscovery()——取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作。
disable()——关闭蓝牙设备。
enable()——直接蓝牙设备,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,下面这两行代码同样是打开蓝牙,不过会提示用户:
<span style="font-size:14px;"> Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);</span>
getAddress()——获取蓝牙设备的MAC地址。
getDefaultAdapter()——获取本地的蓝牙设备(默认BluetoothAdapter),实际上,也只有这一种方法获取BluetoothAdapter
getName()——获取本地蓝牙的名称
getRemoteDevice(String address)——根据远程设备的MAC地址来获取远程设备。 功能:以给定的MAC地址去创建一个 BluetoothDevice 类实例(代表远程蓝牙实例)。即使该蓝牙地址不可见,也会产生一个BluetoothDevice 类实例。 返回BluetoothDevice 类实例 。注意,如果该蓝牙设备MAC地址不能被识别,其蓝牙Name为null。 异常:如果MAC address无效,抛出IllegalArgumentException。
isEnabled()判断蓝牙是否打开,已打开返回true,否则,返回falselistenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServer Socket,这是创建BluetoothSocket服务器端的第一步
startDiscovery()——蓝牙设备开始搜索周边设备
BuletoothDevice——远程设备。它所包含的方法和BluetoothAdapter一样,不再累述。
下图是DEMO界面
MainActivity.java代码:
package com.example.mybluetooth;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private Button open_btn1;
private Button open_btn2;
private Button close_btn;
private Button getmac_btn;
private Button getname_btn;
private Button search_btn;
private Button isenabled_btn;
private Button discoverable_btn;
private BluetoothAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
open_btn1 = (Button) findViewById(R.id.open_btn1);
open_btn2 = (Button) findViewById(R.id.open_btn2);
close_btn = (Button) findViewById(R.id.close_btn);
getmac_btn = (Button) findViewById(R.id.getmac_btn);
getname_btn = (Button) findViewById(R.id.getname_btn);
search_btn = (Button) findViewById(R.id.search_btn);
isenabled_btn = (Button) findViewById(R.id.isenabled_btn);
discoverable_btn = (Button) findViewById(R.id.discoverable_btn);
open_btn1.setOnClickListener(this);
open_btn2.setOnClickListener(this);
close_btn.setOnClickListener(this);
getmac_btn.setOnClickListener(this);
getname_btn.setOnClickListener(this);
search_btn.setOnClickListener(this);
isenabled_btn.setOnClickListener(this);
discoverable_btn.setOnClickListener(this);
adapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.open_btn1:
// 获取本地的蓝牙设备,如果没有则返回null
if (adapter != null) {
if (!adapter.isEnabled()) {
adapter.enable();
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"蓝牙已打开,不需要再打开", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.open_btn2:
if (adapter != null) {
if (!adapter.isEnabled()) {
Intent intent = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"蓝牙已打开,不需要再打开", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.close_btn:
if (adapter != null) {
if (adapter.isEnabled()) {
adapter.disable();
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"蓝牙已关闭,不需要再关闭", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.getmac_btn:
if (adapter != null) {
if (adapter.isEnabled()) {
String mac = adapter.getAddress();
Toast toast = Toast.makeText(getApplicationContext(), mac,
Toast.LENGTH_SHORT);
toast.show();
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"请先打开蓝牙", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.getname_btn:
if (adapter != null) {
if (adapter.isEnabled()) {
String name = adapter.getName();
Toast toast = Toast.makeText(getApplicationContext(), name,
Toast.LENGTH_SHORT);
toast.show();
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"请先打开蓝牙", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.search_btn:
//下一篇文章待续
break;
case R.id.isenabled_btn:
if (adapter != null) {
if (adapter.isEnabled()) {
Toast toast = Toast.makeText(getApplicationContext(),
"蓝牙已打开", Toast.LENGTH_SHORT);
toast.show();
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"蓝牙未打开", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
case R.id.discoverable_btn:
if (adapter != null) {
if (adapter.isEnabled()) {
Intent discoverableIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
// 50这个参数代表的是蓝牙设备能在多少秒内被发现
discoverableIntent.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 50);
startActivity(discoverableIntent);
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"请先打开蓝牙", Toast.LENGTH_SHORT);
toast.show();
}
}
break;
}
}
}