小R科技-WIFI机器人网·机器人创意工作室

标题: Android手机控制智能小车机器人代码 [打印本页]

作者: liuviking    时间: 2012-3-12 20:49
标题: Android手机控制智能小车机器人代码
     目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。
Android是个开源的应用,使用Java语言对其编程。于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,原理就是通过获取蓝牙小车上的蓝牙模块的MAC地址,发起连接请求,并将数据通过Socket封包发送就OK了。
下面开始介绍Android手机端控制程序的编写:
首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。
然后新建一个Android项目,修改布局文件main.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Button
android:id="@+id/btnF"
android:layout_width="100px"
android:layout_height="60px"
android:text="前进"
android:layout_x="130px"
android:layout_y="62px"
>
</Button>
<Button
android:id="@+id/btnL"
android:layout_width="100px"
android:layout_height="60px"
android:text="左转"
android:layout_x="20px"
android:layout_y="152px"
>
</Button>
<Button
android:id="@+id/btnR"
android:layout_width="100px"
android:layout_height="60px"
android:text="右转"
android:layout_x="240px"
android:layout_y="152px"
>
</Button>
<Button
android:id="@+id/btnB"
android:layout_width="100px"
android:layout_height="60px"
android:text="后退"
android:layout_x="130px"
android:layout_y="242px"
>
</Button>
<Button
android:id="@+id/btnS"
android:layout_width="100px"
android:layout_height="60px"
android:text="停止"
android:layout_x="130px"
android:layout_y="152px"
>
</Button>
</AbsoluteLayout>
这个布局文件的效果就是如视频中所示的手机操作界面。
然后是权限声明,这一步不能少,否则将无法使用安卓手机的蓝牙功能。
权限声明如下:
打开AndroidManifest.xml文件,修改代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ThinBTClient.www"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ThinBTClient"
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>
</manifest>
其中红色、加粗部分就是要添加的权限声明。
然后编写Activity中的执行代码,这些代码的作用就是发送指令,控制小车的运动。
代码如下:
package com.ThinBTClient.www;
import android.app.Activity;
import android.os.Bundle;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import android.app.Activity;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;

import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Event;

import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import android.widget.Button;
import android.widget.Toast;
public class ThinBTClient extends Activity {
private static final String TAG = "THINBTCLIENT";

private static final boolean D = true;
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
Button mButtonF;

Button mButtonB;
Button mButtonL;
Button mButtonR;
Button mButtonS;

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

private static String address = "00:11:03:21:00:43"; // <==要连接的蓝牙设备MAC地址

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//前进
mButtonF=(Button)findViewById(R.id.btnF);
mButtonF.setOnTouchListener(new Button.OnTouchListener(){

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
String message;
byte[] msgBuffer;
int action = event.getAction();
switch(action)
{
case MotionEvent.ACTION_DOWN:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "1";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;

case MotionEvent.ACTION_UP:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "0";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;
}
return false;
}


});
//后退
mButtonB=(Button)findViewById(R.id.btnB);
mButtonB.setOnTouchListener(new Button.OnTouchListener(){


@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
String message;
byte[] msgBuffer;
int action = event.getAction();
switch(action)
{
case MotionEvent.ACTION_DOWN:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "3";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;

case MotionEvent.ACTION_UP:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "0";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;
}

return false;
}


});
//左转
mButtonL=(Button)findViewById(R.id.btnL);
mButtonL.setOnTouchListener(new Button.OnTouchListener(){

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
String message;
byte[] msgBuffer;
int action = event.getAction();
switch(action)
{
case MotionEvent.ACTION_DOWN:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "2";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;

case MotionEvent.ACTION_UP:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "0";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;
}

return false;

}
});
//右转
mButtonR=(Button)findViewById(R.id.btnR);
mButtonR.setOnTouchListener(new Button.OnTouchListener(){

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
String message;
byte[] msgBuffer;
int action = event.getAction();
switch(action)
{
case MotionEvent.ACTION_DOWN:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "4";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;

case MotionEvent.ACTION_UP:
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

message = "0";
msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
break;
}

return false;

}


});

//停止
mButtonS=(Button)findViewById(R.id.btnS);
mButtonS.setOnTouchListener(new Button.OnTouchListener(){

@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_DOWN)
try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

String message = "0";
byte[] msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
return false;
}


});


if (D)
Log.e(TAG, "+++ ON CREATE +++");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available.", Toast.LENGTH_LONG).show();
finish();
return;
}

if (!mBluetoothAdapter.isEnabled()) {
Toast.makeText(this, "Please enable your Bluetooth and re-run this program.", Toast.LENGTH_LONG).show();
finish();
return;
}

if (D)
Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
}

@Override
public void onStart() {
super.onStart();
if (D) Log.e(TAG, "++ ON START ++");
}

@Override
public void onResume() {
super.onResume();
if (D) {
Log.e(TAG, "+ ON RESUME +");
Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");
}
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Socket creation failed.", e);
}
mBluetoothAdapter.cancelDiscovery();
try {
btSocket.connect();
Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");
} catch (IOException e) {
try {
btSocket.close();
} catch (IOException e2) {
Log .e(TAG,"ON RESUME: Unable to close socket during connection failure", e2);
}
}

// Create a data stream so we can talk to server.
if (D)
Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +");
/* try {
outStream = btSocket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
}

String message = "1";
byte[] msgBuffer = message.getBytes();
try {
outStream.write(msgBuffer);
} catch (IOException e) {
Log.e(TAG, "ON RESUME: Exception during write.", e);
}
*/
}

@Override
public void onPause() {
super.onPause();

if (D)
Log.e(TAG, "- ON PAUSE -");
if (outStream != null) {
try {
outStream.flush();
} catch (IOException e) {
Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
}
}

try {
btSocket.close();
} catch (IOException e2) {
Log.e(TAG, "ON PAUSE: Unable to close socket.", e2);
}
}

@Override
public void onStop() {
super.onStop();
if (D)Log.e(TAG, "-- ON STOP --");
}

@Override
public void onDestroy() {
super.onDestroy();
if (D) Log.e(TAG, "--- ON DESTROY ---");
}
}
可以看到,在这个程序中我直接把小车蓝牙模块的MAC地址给写进去了,其实更合理一点应该让程序运行后搜索周围蓝牙设备,然后选择需要连接的设备,获取它的MAC地址再连接,但是我为了图省事,就直接把我的小车的蓝牙MAC给定死了(反正也没那么多小车让我遥控~~~),这样一打开程序,手机将自动连接智能小车。
好了,手机端的开发到此介绍完毕~希望能为需要者提供一点帮助。
下一步是打算增加红外避障功能、超声波测距功能,机械手臂,如果有机会,以后再安装上火控系统发射钻天猴~

再次鄙视光显摆却不肯分享技术的装X党!
由于需要源代码的朋友太多,故贴上源工程的下载地址,各位可以到这里下载:
http://download.csdn.net/source/3242996
如果对编程足够熟悉的话,可以自己建立工程并直接复制本人博客中的代码,效果是一样的。
版权所有:Liuviking,转载请注明出处,O(∩_∩)O谢谢~

2011/11/19备注:此控制程序属于第一版,尚有诸多缺陷,仅供参考。目前第二版的蓝牙控制程序已经发出,帖子地址为:http://hi.baidu.com/liuhuiviking/blog/item/392b715133158d928d5430df.html

机器人创意工作室     群号:145181710


作者: 零用钱    时间: 2012-3-23 09:20
直接复制你的代码    有错误提醒  你知道是不是开发环境的问题   你这个工程是建立在安卓什么版本上的?
作者: liuviking    时间: 2012-3-24 12:04
零用钱 发表于 2012-3-23 09:20
直接复制你的代码    有错误提醒  你知道是不是开发环境的问题   你这个工程是建立在安卓什么版本上的?

建立在2.2的版本,我稍后把整个源工程放上来吧。
作者: liweili201    时间: 2012-4-14 21:37
楼主不简单啊!
还有蓝牙版本的程序啊!
作者: robotStudio    时间: 2012-4-20 08:41
楼主的源码早就放出了,稍后我会整里一个比较详细的学习型文档供初级玩家参考。
作者: chuxueze    时间: 2012-5-10 15:17
强大 版主真猛
作者: tyler88    时间: 2012-5-13 01:09
好的,学习
作者: maogefff    时间: 2012-5-29 17:45
第二版的蓝牙控制程序是直接放到手机里就能用了么?还需要改些什么地方么?我对蓝牙方面是一窍不通啊
作者: tspeak019    时间: 2012-6-3 18:13
厉害!!!!!
作者: angelinzy    时间: 2012-6-14 12:22
lz给个管理员吧- -啊啊啊啊啊啊啊好辛苦啊啊啊啊啊啊啊啊啊
作者: angelinzy    时间: 2012-6-14 12:23
辉哥,膜拜一下,我灌水会不会被踢出去啊= =
作者: 业业    时间: 2012-6-29 18:47
牛B............
作者: 1608856815    时间: 2012-7-21 14:41
楼主厉害!!
作者: Siliyaying    时间: 2012-7-24 04:09
请问第二版蓝牙版本的源代码已经发布了咩?或者谁有第二版蓝牙源代码的可否发给我一下呢~万分感谢~
作者: viterhu    时间: 2012-7-27 08:36
哎,我先学学java再来
作者: aking_gong    时间: 2012-8-19 14:56
虚心学习。感谢
作者: YXX    时间: 2012-11-11 00:50
楼主  有没有安卓的  wifi控制版本的啊?

作者: liuviking    时间: 2012-11-11 12:56
YXX 发表于 2012-11-11 00:50
楼主  有没有安卓的  wifi控制版本的啊?

当然有,在论坛里找找。
作者: robotStudio    时间: 2012-11-17 17:22
好贴不顶是不对的。
作者: binz    时间: 2012-11-18 16:29
楼主牛逼啊,,,
作者: yuxuefly    时间: 2012-12-7 18:03
我会运用C#,但是,对安卓还是不行呀!小弟佩服!
作者: loveuyou34    时间: 2013-1-2 19:50
好贴啊,强帖啊,这要加分啊
作者: 肖华    时间: 2013-1-14 21:05
     我太爱了 我想想动手做了
作者: fengzi    时间: 2013-4-23 09:00
谢谢分享。。学习
作者: dongleivip    时间: 2013-4-28 20:10
上个图显示下界面多好的。。。
作者: dongleivip    时间: 2013-4-28 21:47
多谢大侠。   找了老久了。
作者: zk0349    时间: 2013-5-12 13:21
你好猛。。。。
作者: zhao403    时间: 2013-5-16 16:10
好厉害!学习学习
作者: colwer    时间: 2013-5-19 13:30
我想问的是,wifi下能不能实现啊,不用蓝牙
作者: kanaman    时间: 2013-7-11 16:52
为什么进下载频道才能下载啊,最讨厌那个网站了,很难下载资料
作者: jamesliang    时间: 2013-8-27 09:47
好帖,最近也想做一个android控制智能小车
作者: leesqey    时间: 2014-5-5 09:53
老大你在CSDN社区放的蓝牙控制源码怎么只有apk文件,没有源码啊,很多人在说了啊
作者: liuviking    时间: 2014-5-5 11:14
leesqey 发表于 2014-5-5 09:53
老大你在CSDN社区放的蓝牙控制源码怎么只有apk文件,没有源码啊,很多人在说了啊

源码在本论坛。标签选错了没法修改,说的人基本都坐享其成的懒人。
作者: leesqey    时间: 2014-5-5 13:17
liuviking 发表于 2014-5-5 11:14
源码在本论坛。标签选错了没法修改,说的人基本都坐享其成的懒人。

呼呼,嗯,多动动手动动脑子比较好
作者: lanroness    时间: 2014-5-8 16:05
好贴不顶是不对滴~
作者: lanroness    时间: 2014-5-14 16:17
那对应于message = "3",下位机中的情况判断中的case后面应该跟什么呢?我用case 3,case0x03更甚者case 51,case'3'都试过了,后面的指令就是不执行呀
作者: liuviking    时间: 2014-5-14 16:21
lanroness 发表于 2014-5-14 16:17
那对应于message = "3",下位机中的情况判断中的case后面应该跟什么呢?我用case 3,case0x03更甚者case 51 ...

你发下去的是3,那么在下位机就应该是3的ASCII字符代码。
作者: lanroness    时间: 2014-5-14 16:23
lanroness 发表于 2014-5-14 16:17
那对应于message = "3",下位机中的情况判断中的case后面应该跟什么呢?我用case 3,case0x03更甚者case 51 ...

用的是case: ‘3’
作者: 小小世界    时间: 2014-7-25 11:51
感谢楼主,对安卓不怎么熟悉,正在学习中
作者: Douma    时间: 2014-7-30 14:06
鄙视光显摆却不肯分享技术的装X党!赞!!!
作者: 小小世界    时间: 2014-9-2 00:49
用case: ‘3’我的那边也没成功啊,不过我改了一下,把"message = "1";msgBuffer = message.getBytes();"都改成"int msgBuffer=1;"然后单片机上是"case: 3",他就能接收了,不知道其他人用什么方法.
作者: zichenyu    时间: 2014-11-5 09:56
楼主很强大,虚心学习中
作者: nsp    时间: 2015-2-12 12:57
楼主很强大,虚心学习中
作者: 帅到无极限    时间: 2015-3-30 21:13
楼主我想请教一下,手机控制基于arduino平台的机器人,这个代码可不可以参考一下
作者: liuviking    时间: 2015-3-31 10:12
帅到无极限 发表于 2015-3-30 21:13
楼主我想请教一下,手机控制基于arduino平台的机器人,这个代码可不可以参考一下

你用的Arduino代码是哪个?
作者: 帅到无极限    时间: 2015-4-2 15:08
liuviking 发表于 2015-3-31 10:12
你用的Arduino代码是哪个?

哦,你好,这样子的,我如果编写一个ui界面,设定按指定的按钮,然后通过蓝牙发送简单的信号,比如1,2,蓝牙的接收端接收到‘1这个信号后,在执行相应的操作,也就是说我app代码中没有包含有控制机器人运动的代码,运动的代码是事先download到机器人的芯片上的,这样子我的app太过于简单化了。
我的问题就是可不可以在app上编写有控制机器人运动的代码,如果可以,究竟怎么实现,衷心向楼主请教
作者: liuviking    时间: 2015-4-2 15:19
帅到无极限 发表于 2015-4-2 15:08
哦,你好,这样子的,我如果编写一个ui界面,设定按指定的按钮,然后通过蓝牙发送简单的信号,比如1,2, ...

可以的,上位机编排动作,然后发送一系列数据下去,例如这个:http://www.wifi-robots.com/thread-7654-1-1.html
作者: 帅到无极限    时间: 2015-4-2 15:23
liuviking 发表于 2015-4-2 15:19
可以的,上位机编排动作,然后发送一系列数据下去,例如这个:http://www.wifi-robots.com/thread-7654-1 ...

我先看一下,感谢楼主回复
作者: 帅到无极限    时间: 2015-4-3 21:25
liuviking 发表于 2015-4-2 15:19
可以的,上位机编排动作,然后发送一系列数据下去,例如这个:http://www.wifi-robots.com/thread-7654-1 ...

楼主可以讲述一下这句代码是什么意思,有什么用,我安卓底子弱,多谢
outStream = btSocket.getOutputStream();
作者: liuviking    时间: 2015-4-3 22:03
帅到无极限 发表于 2015-4-3 21:25
楼主可以讲述一下这句代码是什么意思,有什么用,我安卓底子弱,多谢
outStream = btSocket.getOutputSt ...

获得输出流
作者: 帅到无极限    时间: 2015-4-3 22:28
liuviking 发表于 2015-4-3 22:03
获得输出流

那这个输出流在这个程序段所获得的信息或者字节是什么
作者: 帅到无极限    时间: 2015-4-3 23:05
帅到无极限 发表于 2015-4-3 22:28
那这个输出流在这个程序段所获得的信息或者字节是什么

过程不是很了解当ACTION_Down时,获得输出流,并且设置message为1,而当ACTION_UP时,又得到一个输出流,设置message为0,有什么作用,它最后通过蓝牙传给下位机的是哪些数据,求大神指点一下
作者: liuviking    时间: 2015-4-4 09:34
帅到无极限 发表于 2015-4-3 23:05
过程不是很了解当ACTION_Down时,获得输出流,并且设置message为1,而当ACTION_UP时,又得到一个输出流, ...

输出流用于发送数据。按下时发出1,松开后发送0
作者: 帅到无极限    时间: 2015-4-7 12:18
liuviking 发表于 2015-4-4 09:34
输出流用于发送数据。按下时发出1,松开后发送0

哦哦,懂了一些,还有一个问题拜托楼主不厌其烦地回答,为什么每次按钮松开后都要发送一个数据0,下位机接收后有什么用,谢谢
作者: liuviking    时间: 2015-4-7 12:20
帅到无极限 发表于 2015-4-7 12:18
哦哦,懂了一些,还有一个问题拜托楼主不厌其烦地回答,为什么每次按钮松开后都要发送一个数据0,下位机 ...

松开后车总要停止呀,0就是停止
作者: 帅到无极限    时间: 2015-4-7 12:23
liuviking 发表于 2015-4-7 12:20
松开后车总要停止呀,0就是停止

对喔,感谢楼主了楼主,祝楼主生活愉快
作者: 帅到无极限    时间: 2015-4-9 21:01
帅到无极限 发表于 2015-4-7 12:23
对喔,感谢楼主了楼主,祝楼主生活愉快

不好意思,楼主,我想做一个搜索蓝牙设备,在你这个发送指令的基础上,应该怎么做
作者: 帅到无极限    时间: 2015-4-9 21:23
帅到无极限 发表于 2015-4-9 21:01
不好意思,楼主,我想做一个搜索蓝牙设备,在你这个发送指令的基础上,应该怎么做

我想保留你的发送指令的代码,但想弄一个按下一个按钮后命令系统去搜索蓝牙设备,可是我检验到但我不用你那个on Start()后面一系列的程序后,单击按钮,app会停止运行,这个问题应该怎么解决,恳请能得到楼主的回复。

下面这个是我一个普普通通的按键
search=(Button)findViewById(R.id.search);
            search.setOnTouchListener(new Button.OnTouchListener(){
               
                               

                                @Override
                                public boolean onTouch(View v, MotionEvent event) {
                                        // TODO Auto-generated method stub
                                       
                                        int action = event.getAction();
                                        switch(action)
                                        {
                                        case MotionEvent.ACTION_DOWN:
                                                //DisplayToast("套接字关闭失败!");
                                                BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                                        if (!adapter.isEnabled()) {
                                            adapter.enable();
                                       //搜索蓝牙设备代码
                                        }
                                     
                                                break;
                                        }
                                        return false;}
            });
作者: ming    时间: 2015-9-29 17:05
学习学习………
作者: 学员2015    时间: 2016-2-14 20:51
值得学习!学习!
作者: 月一鸣    时间: 2016-3-13 13:46
弄得我都想自己也写一个了,虽然不会Java




欢迎光临 小R科技-WIFI机器人网·机器人创意工作室 (http://www.wifi-robots.com/) Powered by Discuz! X3.4