安卓蓝牙通信


package com.example.bluetoothtest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/***
 *
 * @author 张章
 *
 */
public class MainActivity extends Activity {

	TextView t1,t2,t3;
	EditText et;
	Button but,but2,but3,but4,but5,but6,but7,but8,but9;

	ArrayList<BluetoothDevice>deList=new ArrayList<BluetoothDevice>();
	//连接后获取输出流
	OutputStream outputStream;
	BluetoothAdapter bluetooth;
	String uuid="a60f35f0-b93a-11de-8a39-08002009c666";//服务端蓝牙设备的UUID
	Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what==-1){
				Toast.makeText(getApplicationContext(), "等待用户连接。。。。", 1).show();
			}
			if(msg.what==-2){
				Toast.makeText(getApplicationContext(), "已与用户连接。。。。", 1).show();
			}
			if(msg.what==-3){
				Toast.makeText(getApplicationContext(), "等待服务端接受。。。。", 1).show();
			}
			if(msg.what==-4){
				Toast.makeText(getApplicationContext(), "服务端已接受。。。。", 1).show();
			}
			if(msg.what==1){

				Toast.makeText(getApplicationContext(), "接收"+(String)msg.obj, 1).show();
			}
			if(msg.what==2){

				Toast.makeText(getApplicationContext(), "发送 "+(String)msg.obj, 1).show();
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		t1=(TextView) findViewById(R.id.t1);
		t2=(TextView) findViewById(R.id.t2);
		t3=(TextView) findViewById(R.id.t3);
		et=(EditText) findViewById(R.id.et);
		but=(Button) findViewById(R.id.but);
		but2=(Button) findViewById(R.id.but2);
		but3=(Button) findViewById(R.id.but3);
		but4=(Button) findViewById(R.id.but4);
		but5=(Button) findViewById(R.id.but5);
		but6=(Button) findViewById(R.id.but6);
		but7=(Button) findViewById(R.id.but7);
		but8=(Button) findViewById(R.id.but8);
		but9=(Button) findViewById(R.id.but9);
	    //安卓手机可能有多个蓝牙适配器,目前只能使用默认蓝牙适配器,通过该方法可以获取到默认适配器
		bluetooth=BluetoothAdapter.getDefaultAdapter();
		//启用和禁用BluetoothAdapter是耗时的异步操作,需注册Receiver监听状态变化
		registerReceiver(new MyReceiver(), new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
		//调用startDiscovery()方法可以开启设备扫描,注册该Receiver可以收到扫描状态变化(开始扫描还是结束扫描)
		registerReceiver(new SearchReceiver(), new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
		registerReceiver(new SearchReceiver(), new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
		//调用startDiscovery()方法可以开启设备扫描,注册该Receiver可以收到扫描到的设备
		//通过(BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
		//可以获得扫描到的设备
		registerReceiver(new SearchDeviceReceiver(), new IntentFilter(BluetoothDevice.ACTION_FOUND));
		but.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				if(bluetooth.setName(et.getText().toString())){
					Toast.makeText(getApplicationContext(), "设置成功", 1).show();
				}else
					Toast.makeText(getApplicationContext(), "设置失败", 1).show();
			}
		});
		//加入	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>权限
		//后可以直接使用enable()方法启动本机蓝牙适配器,并且可以修改蓝牙友好名称
		but2.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				bluetooth.enable();
			}
		});
		//使用下面语句可以弹出对话框提示是否开启,onActivityResult()方法可获取用户选项
		but3.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),1);
			}
		});
		but4.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				if(bluetooth.isEnabled()){
					t1.setText("地址"+bluetooth.getAddress());
					t2.setText("名称"+bluetooth.getName());
					t3.setText("可见性"+bluetooth.getScanMode());
				}else
					Toast.makeText(getApplicationContext(), "蓝牙不可用", 1).show();
			}
		});
		//修改本机蓝牙可见时间
		but5.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
				intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 1200);
				startActivityForResult(intent, 2);
			}
		});
		but6.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				if(bluetooth.isEnabled()){
					deList.clear();
					bluetooth.startDiscovery();
				}
			}
		});
		but7.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				createServer();
			}

		});

		but8.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				linktoServer();
			}

		});

		but9.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				send();
			}

		});

	}

	private void linktoServer() {
		 try {
			BluetoothDevice bluetoothDevice=deList.get(0);
			bluetoothDevice.getAddress();
			final BluetoothSocket bluetoothSocket=bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
			new Thread(){
				@Override
				public void run() {
					try {
						handler.sendEmptyMessage(-3);
						bluetoothSocket.connect();
						handler.sendEmptyMessage(-4);
						outputStream=bluetoothSocket.getOutputStream();
						getInfo(bluetoothSocket);

					} catch (Exception e) {
						e.printStackTrace();
					}
				};
			}.start();

		} catch (Exception e) {

			e.printStackTrace();
		}
	}
	//创建服务端,类似于Socket编程
	private void createServer()  {
		try {
			final BluetoothServerSocket btserver = bluetooth.listenUsingRfcommWithServiceRecord("server", UUID.fromString(uuid));
			new Thread(){
				@Override
				public void run() {

					try {
						while(true){
							handler.sendEmptyMessage(-1);
							final BluetoothSocket serverSocket = btserver.accept();//阻塞式方法,需开线程
							handler.sendEmptyMessage(-2);
							outputStream=serverSocket.getOutputStream();
							new Thread(){//当有新连接时,交给新线程完成
								public void run() {
									getInfo(serverSocket);
								};
							}.start();
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				};
			}.start();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	private void send() {
		String ss=et.getText().toString().trim();

		try {
			BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(outputStream));
			bw.write(ss);
			bw.newLine();//注意换行
			bw.flush();//刷新缓存
			Message msg=new Message();
			msg.obj=ss;
			msg.what=2;
			handler.sendMessage(msg);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private void getInfo(BluetoothSocket serverSocket) {

		try {
			InputStream inputStream=serverSocket.getInputStream();
			BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
			while(true){
				String msg=br.readLine();
				Message msgs=new Message();
				msgs.obj=msg;
				msgs.what=1;
				handler.sendMessage(msgs);

			}
		} catch (IOException e) {
		}
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode==1&&resultCode==RESULT_OK){
			Toast.makeText(getApplicationContext(), "蓝牙已启用(onActivityResult)", 1).show();
		}
		if(requestCode==2&&resultCode!=RESULT_CANCELED){
			Toast.makeText(getApplicationContext(), "蓝牙可见时间已修改"+requestCode+"(onActivityResult)", 1).show();
		}

	}

	private class MyReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context arg0, Intent intent) {
			int state=intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
			if(state==BluetoothAdapter.STATE_TURNING_ON)
				Toast.makeText(getApplicationContext(), "蓝牙正在开启", 1).show();
			if(state==BluetoothAdapter.STATE_ON)
				Toast.makeText(getApplicationContext(), "蓝牙已经开启", 1).show();
			if(state==BluetoothAdapter.STATE_TURNING_OFF)
				Toast.makeText(getApplicationContext(), "蓝牙正在关闭", 1).show();
			if(state==BluetoothAdapter.STATE_OFF)
				Toast.makeText(getApplicationContext(), "蓝牙已关闭", 1).show();
		}

	}
	private class SearchReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context arg0, Intent intent) {
			if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())){
				Toast.makeText(getApplicationContext(), "启动发现。。。", 1).show();
			}
			if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())){
				Toast.makeText(getApplicationContext(), "发现结束。。。", 1).show();

			}
		}

	}
	private class SearchDeviceReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context arg0, Intent intent) {
			et.append(intent.getStringExtra(BluetoothDevice.EXTRA_NAME)+"\n");
			Toast.makeText(getApplicationContext(), intent.getStringExtra(BluetoothDevice.EXTRA_NAME), 1).show();
			try{
				deList.add((BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE));
				Toast.makeText(getApplicationContext(), "发现设备", 1).show();
			}catch(Exception e){}

		}

	}

}


布局文件如下
<pre name="code" class="html"><ScrollView 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"

	 >
<LinearLayout
     android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/t1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="t1" />

    <TextView
        android:id="@+id/t2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="t2" />

    <TextView
        android:id="@+id/t3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="t3" />

    <EditText
         android:id="@+id/et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="设置名称" />

    <Button
        android:id="@+id/but2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="自动开启" />

    <Button
        android:id="@+id/but3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提示开启" />

    <Button
        android:id="@+id/but4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取信息" />

    <Button
        android:id="@+id/but5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改可见性" />

    <Button
        android:id="@+id/but6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查找设备" />

    <Button
        android:id="@+id/but7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="创建服务端" />

    <Button
        android:id="@+id/but8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="连接到服务端" />
    <Button
        android:id="@+id/but9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送" />

</LinearLayout>
</ScrollView>

manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bluetoothtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
	<uses-permission android:name="android.permission.BLUETOOTH"/>
	<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
</manifest>

注意:安卓手机A,安卓手机B都要安装这款软件,并都点击 提示开启(或自动开启),接着安卓手机A点击  修改可见性  并点击  创建服务端  ,安卓手机B点击查找设备,若找到的第一个设备为安卓手机A,B手机点击   链接到服务端  ,等提示  已经连接   后就可以在文本框中输入文字,然后点击   发送   了

请安装到手机上使用!

工程下载地址   http://pan.baidu.com/s/1eQ3nc3o

安卓蓝牙通信,布布扣,bubuko.com

时间: 2024-10-08 00:21:00

安卓蓝牙通信的相关文章

安卓蓝牙实现即时通讯功能

安卓蓝牙实现即时通讯功能 本demo是<Android智能穿戴设备开发指南>书中的一块内容,实现了两台手机基于蓝牙进行即时通讯的功能. demo演示如下: 结构图 主要代码 MainActivity:启动服务器和客户端界面 @Override public void onClick(View arg0) { switch (arg0.getId()) { case R.id.startServerBtn: //打开服务器 Intent serverIntent = new Intent(Mai

Android开发之蓝牙通信

时隔半年时间,又遇到了蓝牙开发了,之前是蓝牙连接打印相关方面的,这次需要蓝牙配对数据传输,折腾过去折腾过来,也就那么回事,下定决心系统的梳理这块的知识 蓝牙开发必练基本功 蓝牙权限 为了在您的应用程序中使用蓝牙功能,您必须声明蓝牙权限蓝牙.您需要此权限来执行任何蓝牙通信,如请求一个连接.接受一个连接和传输数据.如果你想让你的应用启动设备发现或操纵蓝牙设置,你也必须申报bluetooth_admin许可.大多数应用程序都需要此权限,仅用于发现本地蓝牙设备的能力.此权限授予的其他权限不应被使用,除非

蓝牙通信中读取固定长度数组的解决

2014-05-05 18:10 今天主要忙于工作.之前遇到一个问题,今天得以解决. 问题的描叙:需要从输入流中读取固定长度的字节数组. 问题的解决:今天参考了网上的资料.解决了. 注释部分:之前是通过拷贝数组进行解决,但是难以解决. 解决的代码如下: public synchronized void run() { byte[] buffer = new byte[16]; int bytes = 0; while (mmInStream != null) { try { // 通过连接的端口

PC蓝牙通信C#代码实现

PC蓝牙通信C#代码实现 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#实现PC蓝牙通信代码,供大家参考,具体内容如下 添加引用InTheHand.Net.Personal.dll 首先创建一个蓝牙类 class LanYa { public string blueName { get; set; } //l蓝牙名字 public BluetoothAddress blueAddress { get; set; }

android 蓝牙通信编程

转自:http://blog.csdn.net/yudajun/article/details/8362916 公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助. 以下是开发中的几个关键步骤: 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 下面是一个demo 效果图: SearchDeviceActivity.java [java] view plaincopy package 

【Android源码】BLE蓝牙通信Bluetooth_4.3

该Demo主要是兼容了支持BLE的Android4.3终端设备之间的蓝牙通信. 主要功能包含: 1.蓝牙的开启.关闭: 2.周围蓝牙开启设备的搜索.建连 3.成功建连后,通过蓝牙向对方发送消息. 注:要想观察发送/接收消息,必须双方都安装了此APP. 下载地址:http://www.devstore.cn/code/info/713.html    

Android蓝牙通信详解

蓝牙通信的大概步骤如下: 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 还要发送配对码发送进行判断! 下面是所有的源代码:不会很难:认真看: SearchDeviceActivity.java [java] view plaincopy package com.hello.project; import java.util.ArrayList; import java.util.Iterator; import java.

Android蓝牙通信

Android为蓝牙设备之间的通信封装好了一些调用接口,使得实现Android的蓝牙通信功能并不困难.可通过UUID使两个设备直接建立连接. 具体步骤: 1.  获取BluetoothAdapter实例,注册一个BroadcastReceiver监听蓝牙扫描过程中的状态变化 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); IntentFilter filter = new IntentFilter(BluetoothDevice

BLE蓝牙通信Bluetooth_4.3

该Demo主要是兼容了支持BLE的Android4.3终端设备之间的蓝牙通信. 主要功能包含: 1.蓝牙的开启.关闭: 2.周围蓝牙开启设备的搜索.建连 3.成功建连后,通过蓝牙向对方发送消息. 注:要想观察发送/接收消息,必须双方都安装了此APP. 下载地址:http://www.devstore.cn/code/info/713.html 运行截图: