配置权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Xml
<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=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0f0"
>
<Button
android:id="@+id/check_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="检查蓝牙"
/>
<Button
android:id="@+id/open_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="打开蓝牙"
/>
<Button
android:id="@+id/scan_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="扫描蓝牙"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00f"
>
<EditText
android:id="@+id/msg"
android:layout_width="120dp"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/send"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="发送"
/>
<TextView
android:id="@+id/showmsg1"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:background="#f00" />
</LinearLayout>
<ListView
android:id="@+id/pdbluetooth"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:background="#f00"
/>
<ListView
android:id="@+id/unpdbluetooth"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
MainActivity
package com.ch.day15_bluetooth;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnItemClickListener{
public static UUID uuid = UUID.fromString("00001001-0000-1000-8000-00805F9B34FB");
private Button check,open,scan;
private EditText msg;
private Button send;
private TextView showmsg;
//蓝牙显示的列表
private ListView pdbluetooth,unpdbluetooth;
//蓝牙显示的列表的适配器
private ArrayAdapter<String> pdAdapter,unpdAdapter;
private BluetoothAdapter bluetoothAdapter;
private Context mcontext;
//声明集合,保存配对过的蓝牙,和没有配对过
private ArrayList<BluetoothDevice> pdbluetoothDevices,unpdbluetoothDevices;
//定义一个蓝牙的输出流
OutputStream output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcontext = this;
init();
}
//接收其他的蓝牙给本手机发送的信息的线程,传递信息到这个handler,显示在主线程的ui上
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
showmsg.setText((String)msg.obj);
};
};
public void init(){
check = (Button) findViewById(R.id.check_bluetooth);
open = (Button) findViewById(R.id.open_bluetooth);
scan = (Button) findViewById(R.id.scan_bluetooth);
//添加单击监听
check.setOnClickListener(clickLis);
open.setOnClickListener(clickLis);
scan.setOnClickListener(clickLis);
//获得发送信息区域
msg = (EditText) findViewById(R.id.msg);
send = (Button) findViewById(R.id.send);
showmsg = (TextView) findViewById(R.id.showmsg1);
send.setOnClickListener(clickLis);
//获得listview
pdbluetooth = (ListView) findViewById(R.id.pdbluetooth);
unpdbluetooth = (ListView) findViewById(R.id.unpdbluetooth);
//创建listview的适配器
pdAdapter = new ArrayAdapter<String>(mcontext, android.R.layout.simple_list_item_1);
unpdAdapter = new ArrayAdapter<String>(mcontext, android.R.layout.simple_list_item_1);
//把适配器,添加给Listview
pdbluetooth.setAdapter(pdAdapter);
unpdbluetooth.setAdapter(unpdAdapter);
//给listview添加点击事件
pdbluetooth.setOnItemClickListener(this);
unpdbluetooth.setOnItemClickListener(this);
//创建保存蓝牙的集合
pdbluetoothDevices = new ArrayList<BluetoothDevice>();
unpdbluetoothDevices = new ArrayList<BluetoothDevice>();
//开启接收蓝牙信息的线程
new BlueAcceptThread(mcontext, handler).start();
}
OnClickListener clickLis = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
//检查蓝牙设置是否有
case R.id.check_bluetooth:
//获得蓝牙适配器,没有表示没有蓝牙设备
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter != null){
Toast.makeText(mcontext, "支持蓝牙!", 0).show();
}else{
Toast.makeText(mcontext, "没有蓝牙设备!", 0).show();
}
break;
case R.id.open_bluetooth:
if(bluetoothAdapter != null){
if(!bluetoothAdapter.enable()){//蓝牙设备可不用,未打开
bluetoothAdapter.enable();//打开蓝牙
// 通过启动相关Activity打开
// Intent it = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// startActivity(it);
}
//设置蓝牙可见的时间长度为300秒
Intent it = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
it.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 600);
startActivity(it);
}else{
Toast.makeText(mcontext, "检查是否支持蓝牙!", 0).show();
}
break;
case R.id.scan_bluetooth:
pdbluetoothDevices.clear();//清空就得配对蓝牙
unpdbluetoothDevices.clear();//再一次扫描蓝牙,清空旧的未配对蓝牙列表信息
pdAdapter.clear();
unpdAdapter.clear();
if(bluetoothAdapter != null){
//如果正在扫描,关闭扫描,重新扫描
if(bluetoothAdapter.isDiscovering()){
bluetoothAdapter.cancelDiscovery();
}
//获得已经配对过得蓝牙设备
Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
if(devices.size() > 0){//有配对的蓝牙
//遍历配对过得蓝牙
for(BluetoothDevice device:devices){
pdbluetoothDevices.add(device);//收集配对的蓝牙
pdAdapter.add(device.getName()+"---"+device.getAddress());//把蓝牙的信息给listview的适配器
}
}
//注册接收扫描到蓝牙的广播,从中获得扫描到的蓝牙
IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter1);
//注册扫描完成的广播
IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, filter2);
//重新扫描所以蓝牙
bluetoothAdapter.startDiscovery();
}else{
Toast.makeText(mcontext, "检查是否支持蓝牙!", 0).show();
}
break;
case R.id.send:
if(output != null){
String msgdata = msg.getText().toString();
FileInputStream fis = null;
try {
//发送信息到刚刚连接的蓝牙
output.write(msgdata.getBytes());
fis = new FileInputStream("/nmt/sdcard/360sicheck.txt");
int length = fis.available();
byte[] buffer = new byte[length];
fis.read(buffer);
output.write(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else{
Toast.makeText(mcontext, "请先选择一个蓝牙!", 0).show();
}
break;
default:
break;
}
}
};
/**
* 此广播用来接收扫描到蓝牙的广播
*/
BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//接受扫描到的蓝牙
String action = intent.getAction();//得到广播的动作(类型)
if(action.equals(BluetoothDevice.ACTION_FOUND)){//扫描到蓝牙的广播
//获得扫描到的蓝牙
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//此蓝牙没有绑定过(配对过)
if(device.getBondState() != BluetoothDevice.BOND_BONDED){
unpdbluetoothDevices.add(device);//收集未绑定的蓝牙
unpdAdapter.add(device.getName()+"---"+device.getAddress());//未绑定的蓝牙的listview的适配器
}
}else if(action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
Toast.makeText(mcontext, "扫描完成!", 0).show();
}
}
};
/**
* lisrview的点击事件监听器
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
switch (parent.getId()) {
case R.id.pdbluetooth://点击的是配对过的listview
pairOrConnectionDevice(pdbluetoothDevices.get(position));//操作配对过的蓝牙
break;
case R.id.unpdbluetooth://点击的是没有配对过的listview
pairOrConnectionDevice(unpdbluetoothDevices.get(position));//操作没有配对过的蓝牙
break;
default:
break;
}
}
/**
* 此方法负责处理蓝牙,配对或直接连接
* @param bluetoothDevice
*/
private void pairOrConnectionDevice(BluetoothDevice bluetoothDevice) {
int state = bluetoothDevice.getBondState();//获得
if(state == BluetoothDevice.BOND_NONE){//还没有配对,进行配对
try {
//通过反射,设置此蓝牙为绑定状态
Method method = BluetoothDevice.class.getMethod("createBond");
method.invoke(bluetoothDevice);
Toast.makeText(mcontext, bluetoothDevice.getName()+",配对成功!", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(mcontext, bluetoothDevice.getName()+",配对失败!", 0).show();
}
}else if(state == BluetoothDevice.BOND_BONDED){//配对过的,进行连接
new BlueToothConnection(bluetoothDevice).start();
}
}
/**
* 此线程用于为蓝牙建立连接,发送信息
* @author hchen
*
*/
class BlueToothConnection extends Thread{
BluetoothDevice device;
BluetoothSocket bluetoothSocket;
public BlueToothConnection(BluetoothDevice device) {
super();
this.device = device;
}
@Override
public void run() {
Looper.prepare();//发送信息前的准备
try {
//创建此蓝牙的客户端,通过客户端可以向它传递数据
bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
//连接
System.out.println("000000000000000");
bluetoothSocket.connect();
System.out.println("1111111111111111111");
//创建此蓝牙的具体的输出流
output = bluetoothSocket.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Looper.loop();
}
}
}
BlueAcceptThread
package com.ch.day15_bluetooth;
import java.io.IOException;
import java.io.InputStream;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
public class BlueAcceptThread extends Thread{
private Context mcontext;
private Handler handler;
private BluetoothAdapter bluetoothAdapter;
BluetoothServerSocket bluetoothServerSocket;
BluetoothSocket bluetoothSocket;
InputStream input;
public BlueAcceptThread(Context mcontext,Handler handler) {
super();
this.mcontext = mcontext;
this.handler = handler;
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public void run() {
if(bluetoothAdapter != null){
try {
//创建本手机的蓝牙的服务器
bluetoothServerSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("mybluetooth", MainActivity.uuid);
//接收一个蓝牙客户端
Log.i("TAG","准备.....接收一个......................");
bluetoothSocket = bluetoothServerSocket.accept();
Log.i("TAG","接收了一个......................");
//得到连接我的那个一方的输入流
input = bluetoothSocket.getInputStream();
byte[] buffer = new byte[1024];
//读取数据,循环多次,因为有多条
while(true){
//读取当前这一条
int length = input.read(buffer);
String getData = new String(buffer,0,length);
Log.i("TAG","接收信息.........."+getData);
handler.sendMessage(handler.obtainMessage(0x123, getData));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}