简介
蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效的简化移动通信终端设备之间的通信,也能够成功的简化设备与Internet之间的通信,这样数据传输变得更加迅速高效,为无线通信拓宽道路。
蓝牙API
Android所有关于蓝牙开发的类都在android.bluetooth包下,只有8个类:
BluetoothAdapter 本地蓝牙适配器
BluetoothClass 蓝牙类(主要包括服务和设备)
BluetoothClass.Device 蓝牙设备类
BluetoothClass.Device.Major 蓝牙设备管理
BluetoothClass.Service 蓝牙服务类
BluetoothDevice 蓝牙设备(远程蓝牙设备)
BluetoothServiceSocket 监听蓝牙连接的类
BluetoothSocket 蓝牙连接类
所需权限
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
使用蓝牙的步骤
1、获取本地蓝牙适配器
BluetoothAdapter mAdapter= BluetoothAdapter.getDefaultAdapter();
2、打开蓝牙
//弹出对话框提示用户是否打开
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler, REQUEST_ENABLE);
//不做提示,强行打开
// mAdapter.enable();
}
补充一下,使设备能够被搜索
Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(enabler,REQUEST_DISCOVERABLE);
3、搜索设备
1)mAdapter.startDiscovery()是第一步,可是你会发现没有返回的蓝牙设备,怎么知道查找到了呢?
2)定义BroadcastReceiver,代码如下
BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//找到设备
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
Log.v(TAG, "find device:" + device.getName()+ device.getAddress());
}
//搜索完成
}else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
setTitle("搜索完成");
if (mNewDevicesAdapter.getCount() == 0) {
Log.v(TAG,"find over");
}
}//执行更新列表的代码
}
需要注册BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter);
4、建立连接
1)服务器端:
BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);
serverSocket.accept();
2)客户端:
BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);
clienSocket.connect();
5、数据传递
1)获取流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
2)写出、读入
BluetoothServerSocket
BluetoothServerSocket BluetoothAdapter.listenUsingRfcommWithServiceRecord(String name, UUID)
通过此方法监听BluetoothSocket的连接
BluetoothServerSocket.accept() 开始接收BluetoothSocket
BluetoothServerSocket.close() 关闭服务
BluetoothSocket
BluetoothSocket BluetoothDevice.createInsecureRfcommSocketToServiceRecord(UUID uuid)
通过此方法向指定的BluetoothDevice发送Socket连接
UUID:00001101-0000-1000-8000-00805F9B34FBconnect() 尝试连接boolean isConnected() 是否已连接,要求最低sdk 14+
BluetoothDevice getRemoteDevice() 获取当前正在或已连接的设备
InputStream getInputStream() 获取输入流
OutputStream getOutputStream() 获取输出流
在读取数据时用数据流
DataInputStream/DataOutputStream
基于Socket技术实现蓝牙聊天
蓝牙的配对
查找已配对的蓝牙设备
Set<BluetoothDevice> BluetoothAdapter.getBondedDevices()查找附件的蓝牙设备
BluetoothAdapter.startDiscovery())
BluetoothAdapter.isDiscovering() 是否正在查找
BluetoothAdapter.cancelDiscovery() 取消查找
注册广播接收器接收查到的设备信息
BluetoothAdapter.ACTION_DISCOVERY_STARTED 开始查找
BluetoothDevice.ACTION_FOUND 查找到蓝牙设备
BluetoothDevice.EXTRA_DEVICE 获取查找到的设备信息,此数据为ParcelableExtra,
需要intent.getParcelableExtra()获取到BluetoothDevice对象
BluetoothAdapter.ACTION_DISCOVERY_FINISHED 查找结束
判断配对状态int BluetoothDevice.getBondState() 获取设备的配对状态
BluetoothDevice.BOND_BONDED 已配对
BluetoothDevice.BOND_BONDING 正在配对
BluetoothDevice.BOND_NONE 未配对
与指定未配对的设备配对
配对:通过反射获取BluetoothDevice的boolean createBond()方法,并执行
取消配对:通过反射获取BluetoothDevice的boolean removeBond()方法,并执行
普通调用案例
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xiaofei.app.bluetooth.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打开蓝牙设备"
android:id="@+id/open"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭蓝牙设备"
android:id="@+id/close"
android:layout_below="@+id/open"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="搜索蓝牙设备"
android:id="@+id/button_scan"
android:layout_below="@+id/close"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
MainActivity.java
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.Set;
public class MainActivity extends Activity implements View.OnClickListener {
private Button open, close,button_scan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
open = (Button) findViewById(R.id.open);
close = (Button) findViewById(R.id.close);
button_scan = (Button) findViewById(R.id.button_scan);
open.setOnClickListener(this);
close.setOnClickListener(this);
button_scan.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.open:
//第一种方法,打开蓝牙设备(提示对话框)
/* Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);*/
//第二种方法,打开蓝牙,静默打开
BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.enable();
break;
case R.id.close:
BluetoothAdapter bluetoothAdapter1=BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter1.disable();
break;
case R.id.button_scan:
//开始扫描蓝牙设备
BluetoothAdapter bluetoothAdapter2=BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter2.startDiscovery();
System.out.println("开始扫描蓝牙设备");
Set<BluetoothDevice> set=bluetoothAdapter2.getBondedDevices();
for (BluetoothDevice bd : set)
{
System.out.println("name"+bd.getName());
System.out.println("address"+bd.getAddress());
}
break;
default:
break;
}
}
}
通讯案例
MainActivity.java
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.Set;
public class MainActivity extends Activity implements View.OnClickListener {
private Button open, close, button_scan, button_server, button_client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
open = (Button) findViewById(R.id.open);
close = (Button) findViewById(R.id.close);
button_scan = (Button) findViewById(R.id.button_scan);
button_server = (Button) findViewById(R.id.button_server);
button_client = (Button) findViewById(R.id.button_client);
open.setOnClickListener(this);
close.setOnClickListener(this);
button_scan.setOnClickListener(this);
button_server.setOnClickListener(this);
button_client.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.open:
//第一种方法,打开蓝牙设备(提示对话框)
/* Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);*/
//第二种方法,打开蓝牙,静默打开
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.enable();
break;
case R.id.close:
BluetoothAdapter bluetoothAdapter1 = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter1.disable();
break;
case R.id.button_scan:
//开始扫描蓝牙设备
BluetoothAdapter bluetoothAdapter2 = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter2.startDiscovery();
System.out.println("开始扫描蓝牙设备");
Set<BluetoothDevice> set = bluetoothAdapter2.getBondedDevices();
for (BluetoothDevice bd : set) {
System.out.println("name" + bd.getName());
System.out.println("address" + bd.getAddress());
}
break;
case R.id.button_server:
Intent intent = new Intent(this, ServerBluetoothActivity.class);
startActivity(intent);
break;
case R.id.button_client:
Intent intent1 = new Intent(this, ClientBluetoothActivity.class);
startActivity(intent1);
break;
default:
break;
}
}
}
ServerBluetoothActivity.java
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.ref.WeakReference;
import java.util.UUID;
public class ServerBluetoothActivity extends Activity {
private static final int CONN_SUCCESS=0x1;
private static final int CONN_FAIL=0x2;
private static final int RECEIVER_INFO=0x3;
private static final int SET_EDITTEXT_NULL=0x4;
private static Button button_send;
private static TextView textView_content;
private static EditText editText_info;
BluetoothAdapter bluetooth=null;//本地蓝牙设备
BluetoothServerSocket serverSocket=null;//蓝牙设备Socket服务端
BluetoothSocket socket=null;//蓝牙设备Socket客户端
//输入输出流
PrintStream out;
BufferedReader in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server_bluetooth);
setTitle("蓝牙服务端");
textView_content= (TextView) findViewById(R.id.textView_content);
editText_info= (EditText) findViewById(R.id.editText_info);
button_send= (Button) findViewById(R.id.button_send);
init();
}
//创建蓝牙服务器端的Socket
private void init() {
textView_content.setText("服务器已启动,正在等待连接...\n");
new Thread(new Runnable() {
@Override
public void run() {
//1.得到本地设备
bluetooth=BluetoothAdapter.getDefaultAdapter();
//2.创建蓝牙Socket服务器
try
{
serverSocket=bluetooth.listenUsingRfcommWithServiceRecord("text", UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
//3.阻塞等待Socket客户端请求
socket=serverSocket.accept();
if (socket!=null)
{
out=new PrintStream(socket.getOutputStream());
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
handler.sendEmptyMessage(CONN_SUCCESS);
}
catch (IOException e)
{
e.printStackTrace();
Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
handler.sendMessage(msg);
}
}
}).start();
}
//防止内存泄漏 正确的使用方法
private final MyHandler handler = new MyHandler(this);
public class MyHandler extends Handler {
//软引用
WeakReference<ServerBluetoothActivity> weakReference;
public MyHandler(ServerBluetoothActivity activity) {
weakReference = new WeakReference<ServerBluetoothActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ServerBluetoothActivity activity = weakReference.get();
if (activity != null) {
switch (msg.what) {
case RECEIVER_INFO:
setInfo(msg.obj.toString() + "\n");
break;
case SET_EDITTEXT_NULL:
editText_info.setText("");
break;
case CONN_SUCCESS:
setInfo("连接成功!\n");
button_send.setEnabled(true);
new Thread(new ReceiverInfoThread()).start();
break;
case CONN_FAIL:
setInfo("连接失败!\n");
setInfo(msg.obj.toString() + "\n");
break;
default:
break;
}
}
}
}
private boolean isReceiver=true;
class ReceiverInfoThread implements Runnable {
@Override
public void run() {
String info=null;
while (isReceiver)
{
try {
info=in.readLine();
Message msg=handler.obtainMessage(RECEIVER_INFO,info);
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void sendClick(View v)
{
final String content=editText_info.getText().toString();
if (TextUtils.isEmpty(content))
{
Toast.makeText(ServerBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
out.println(content);
out.flush();
handler.sendEmptyMessage(SET_EDITTEXT_NULL);
}
}).start();
}
private void setInfo(String info)
{
StringBuffer sb=new StringBuffer();
sb.append(textView_content.getText());
sb.append(info);
textView_content.setText(sb);
}
}
ClientBluetoothActivity.java
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.ref.WeakReference;
import java.util.UUID;
public class ClientBluetoothActivity extends Activity {
private static final int CONN_SUCCESS=0x1;
private static final int CONN_FAIL=0x2;
private static final int RECEIVER_INFO=0x3;
private static final int SET_EDITTEXT_NULL=0x4;
private static Button button_send;
private static TextView textView_content;
private static EditText editText_info;
BluetoothAdapter bluetooth=null;//本地蓝牙设备
BluetoothDevice device=null;//远程蓝牙设备
BluetoothSocket socket=null;//蓝牙设备Socket客户端
//输入输出流
PrintStream out;
BufferedReader in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_bluetooth);
setTitle("蓝牙客户端");
textView_content= (TextView) findViewById(R.id.textView_content);
editText_info= (EditText) findViewById(R.id.editText_info);
button_send= (Button) findViewById(R.id.button_send);
init();
}
//创建蓝牙客户端端的Socket
private void init() {
textView_content.setText("客户端已启动,正在等待连接...\n");
new Thread(new Runnable() {
@Override
public void run() {
//1.得到本地蓝牙设备的默认适配器
bluetooth=BluetoothAdapter.getDefaultAdapter();
//2.通过本地蓝牙设备得到远程蓝牙设备
device=bluetooth.getRemoteDevice("22:22:4E:6E:59:86");
//3.根据UUID创建并返回一个BoluetoothSocket
try {
socket=device.createRfcommSocketToServiceRecord(UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
if (socket!=null)
{
// 连接
socket.connect();
//处理客户端输出流
out=new PrintStream(socket.getOutputStream());
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
handler.sendEmptyMessage(CONN_SUCCESS);
} catch (IOException e) {
e.printStackTrace();
Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
handler.sendMessage(msg);
}
}
}).start();
}
//防止内存泄漏 正确的使用方法
private final MyHandler handler = new MyHandler(this);
public class MyHandler extends Handler {
//软引用
WeakReference<ClientBluetoothActivity> weakReference;
public MyHandler(ClientBluetoothActivity activity) {
weakReference = new WeakReference<ClientBluetoothActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ClientBluetoothActivity activity = weakReference.get();
if (activity != null) {
switch (msg.what) {
case RECEIVER_INFO:
setInfo(msg.obj.toString() + "\n");
break;
case SET_EDITTEXT_NULL:
editText_info.setText("");
break;
case CONN_SUCCESS:
setInfo("连接成功!\n");
button_send.setEnabled(true);
System.out.println("name"+device.getName());
System.out.println("Uuids"+device.getUuids());
System.out.println("Address"+device.getAddress());
new Thread(new ReceiverInfoThread()).start();
break;
case CONN_FAIL:
setInfo("连接失败!\n");
setInfo(msg.obj.toString() + "\n");
break;
default:
break;
}
}
}
}
private boolean isReceiver=true;
//接收信息的线程
class ReceiverInfoThread implements Runnable {
@Override
public void run() {
String info=null;
while (isReceiver)
{
try {
System.out.println("--ReceiverInfoThread start --");
info=in.readLine();
System.out.println("--ReceiverInfoThread read --");
Message msg=handler.obtainMessage(RECEIVER_INFO,info);
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void sendClick(View v)
{
final String content=editText_info.getText().toString();
if (TextUtils.isEmpty(content))
{
Toast.makeText(ClientBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
out.println(content);
out.flush();
handler.sendEmptyMessage(SET_EDITTEXT_NULL);
}
}).start();
}
private void setInfo(String info)
{
StringBuffer sb=new StringBuffer();
sb.append(textView_content.getText());
sb.append(info);
textView_content.setText(sb);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xiaofei.app.bluetooth.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打开蓝牙设备"
android:id="@+id/open"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭蓝牙设备"
android:id="@+id/close"
android:layout_below="@+id/open"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="搜索蓝牙设备"
android:id="@+id/button_scan"
android:layout_below="@+id/close"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="服务器端"
android:id="@+id/button_server"
android:layout_below="@+id/button_scan"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button_scan"
android:layout_alignEnd="@+id/button_scan" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="客户端"
android:id="@+id/button_client"
android:layout_below="@+id/button_server"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/button_server"
android:layout_alignEnd="@+id/button_server" />
</RelativeLayout>
activity_client_bluetooth.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xiaofei.app.bluetooth.ServerBluetoothActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text=""
android:id="@+id/textView_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_above="@+id/editText_info"
android:layout_below="@+id/textView" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText_info"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/button_send"
android:layout_toStartOf="@+id/button_send" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send"
android:id="@+id/button_send"
android:onClick="sendClick"
android:layout_alignBottom="@+id/editText_info"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="客户端"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
activity_server_bluetooth.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xiaofei.app.bluetooth.ServerBluetoothActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text=""
android:id="@+id/textView_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_above="@+id/editText_info"
android:layout_below="@+id/textView" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText_info"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/button_send"
android:layout_toStartOf="@+id/button_send" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send"
android:id="@+id/button_send"
android:onClick="sendClick"
android:layout_alignBottom="@+id/editText_info"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="服务器端"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>