转自:http://blog.csdn.net/einarzhang/article/details/6943861
在AndroidSDK sample中给出了一个蓝牙聊天的示例代码,本文只是略作修改变成一个简单的服务器和客户端模式的应用,以适应在游戏开发中一对一关联的数据传输。
由于游戏中的蓝牙设置在新线程中发生,所以采用Handler的方式将蓝牙的状态以及读取信息传输给显示Activity。
1 开启蓝牙,包括xml中的配置:
-
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
-
<uses-permissionandroid:name="android.permission.BLUETOOTH"/>
-
-
BluetoothAdapterbtAdapter=BlueToothService.getInstance().getBtAdapter();
-
-
if(!btAdapter.isEnabled()){
-
-
IntentenableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
-
-
startActivityForResult(enableIntent,ConstantsUtil.ENABLE_BLUETOOTH);
-
-
}
2 在当前Activity中获取蓝牙开启结果,并根据具体情况对蓝牙进行处理
-
@Override
-
-
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
-
-
switch(requestCode){
-
-
caseConstantsUtil.ENABLE_BLUETOOTH:
-
-
if(resultCode==Activity.RESULT_OK){
-
-
bluetoothProcess(PSystem.isServer);
-
-
}else{
-
-
finish();
-
-
}
-
-
}
-
-
}
-
-
publicvoidbluetoothProcess(booleanisServer){
-
BlueToothService.getInstance().setsHandler(mHandler);
-
if(isServer){
-
-
if(btAdapter.getScanMode()!=BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE){
-
IntentdiscoverableIntent=newIntent(
-
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
-
discoverableIntent.putExtra(
-
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,180);
-
startActivity(discoverableIntent);
-
}
-
BlueToothService.getInstance().start();
-
}else{
-
-
blueToothNames=newArrayList<String>();
-
blutToothDevices=newArrayList<BluetoothDevice>();
-
-
IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);
-
this.registerReceiver(mReceiver,filter);
-
filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
-
this.registerReceiver(mReceiver,filter);
-
-
doDiscovery();
-
}
-
}
-
publicvoiddoDiscovery(){
-
if(btAdapter.isDiscovering()){
-
btAdapter.cancelDiscovery();
-
}
-
btAdapter.startDiscovery();
-
}
3 蓝牙广播接收器
-
privatefinalBroadcastReceivermReceiver=newBroadcastReceiver(){
-
@Override
-
publicvoidonReceive(Contextcontext,Intentintent){
-
Stringaction=intent.getAction();
-
if(BluetoothDevice.ACTION_FOUND.equals(action)){
-
BluetoothDevicedevice=intent
-
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-
if(device.getName()!=null&&!device.getName().trim().equals("")){
-
blueToothNames.add(device.getName());
-
blutToothDevices.add(device);
-
}
-
}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
-
.equals(action)){
-
btAdapter.cancelDiscovery();
-
TestActivity.this.unregisterReceiver(this);
-
}
-
}
-
};
4 以上是蓝牙基本配置和发现。现在进行蓝牙监听和连接:
蓝牙服务器监听代码:
-
publicvoidstart(){
-
BluetoothServerSocketserverSocket=null;
-
try{
-
serverSocket=btAdapter.listenUsingRfcommWithServiceRecord("JumpForMeApp",MY_UUID_SECURE);
-
changeState(ConstantsUtil.BT_STATE_LISTEN);
-
btSocket=serverSocket.accept();
-
}catch(IOExceptione){
-
}finally{
-
try{
-
serverSocket.close();
-
}catch(IOExceptione){
-
}
-
}
-
if(btSocket!=null){
-
changeState(ConstantsUtil.BT_STATE_CONNECTED);
-
}
-
}
客户端连接代码:
-
publicvoidconnect(BluetoothDevicedevice){
-
try{
-
btAdapter.cancelDiscovery();
-
btSocket=device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
-
changeState(ConstantsUtil.BT_STATE_CONNECTING);
-
btSocket.connect();
-
}catch(IOExceptione){
-
}
-
changeState(ConstantsUtil.BT_STATE_CONNECTED);
-
}
5利用蓝牙进行消息传递,建立新的线程来处理读写操作(见BluetoothChat Sample中的ConnectedThread):
-
classConnectedThreadextendsThread{
-
privatefinalBluetoothSocketmmSocket;
-
privatefinalInputStreammmInStream;
-
privatefinalOutputStreammmOutStream;
-
-
publicConnectedThread(BluetoothSocketsocket){
-
mmSocket=socket;
-
InputStreamtmpIn=null;
-
OutputStreamtmpOut=null;
-
try{
-
tmpIn=socket.getInputStream();
-
tmpOut=socket.getOutputStream();
-
}catch(IOExceptione){
-
Log.e(TAG,"tempsocketsnotcreated",e);
-
}
-
mmInStream=tmpIn;
-
mmOutStream=tmpOut;
-
}
-
-
publicvoidrun(){
-
byte[]buffer=newbyte[1024];
-
intbytes;
-
while(true){
-
try{
-
bytes=mmInStream.read(buffer);
-
if(transHandler!=null){
-
-
transHandler.sendMessage(transHandler.obtainMessage(ConstantsUtil.BT_READ,bytes,-1,buffer));
-
}
-
}catch(IOExceptione){
-
Log.e(TAG,"disconnected",e);
-
break;
-
}
-
}
-
}
-
-
publicvoidwrite(byte[]buffer){
-
try{
-
mmOutStream.write(buffer);
-
}catch(IOExceptione){
-
Log.e(TAG,"Exceptionduringwrite",e);
-
}
-
}
-
-
publicvoidcancel(){
-
try{
-
mmSocket.close();
-
}catch(IOExceptione){
-
Log.e(TAG,"close()ofconnectsocketfailed",e);
-
}
-
}
-
}
-
分享到:
相关推荐
蓝牙技术详述,很经典的书籍,对蓝牙的协议栈进行了详细的分析。
《C#开发Android应用实战——使用Mono for Android和.NET/C# 全面透彻地讲解Android应用编程知识,分析如何结合使用C#和Mono来编写在Android设备系列上运行的应用程序。在这本由多位专家联袂撰写的必备精品书籍的...
刚刚做完一个项目,自己总结的Provider用法。
android Activity 详述 demo 具体博文: http://blog.csdn.net/q610098308/article/details/50057927
android.mk文件语法详述及简单实例
Android开发应用从入门到精通 朱桂英 中国铁道出版社 本书循序渐进地讲解了android技术的基本知识,并通过实例直观地演示了android在各个领域中的具体应用。本书内容新颖、知识全面、讲解详细,全书分为4篇17章,第...
教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux...
java编写的FineReport报表进行二次开发
Linux系统下配置Java开发环境详述
本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...
在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的...
本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...
《Android 4高级编程(第3版)》见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助此入门。作为一本以实用性为目的的指导图书,...
详述VOIP基础详述VOIP基础详述VOIP基础详述VOIP基础详述VOIP基础
本人将Spring MVC的一般开发步骤做了一个详细的记录 有相关截图 相关核心代码 为懂各个java代码但是不会整合开发的朋友提供一个借鉴 希望朋友们看了文档后能够达到用java做系统全程开发的能力 主要涉及的内容有以下...
整个游戏开发流程的详细介绍,包括所有步骤。
如何在Linux下配置Java开发环境详述,相当经典。
Linux下配置Java开发环境详述[文].pdf
本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...
本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...