版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本文我们将通过学习An droid的蓝牙聊天示例应用程序来介绍蓝牙开发包的使用,该示例程序完整的包含了蓝牙开发的各个部分,将实现两个设备通过蓝牙进行连接并聊天。An droidMa nifest.xml前面我们说过,在使用蓝牙API时就需要开启某些权限,同时我们还可以从AndroidMa nifest.xml文件中找到应用程序启动时所进入的界面面我们首先打开An droidMa nifest.xml文件,代码如下:Activity等信息,因此下复制到剪贴板Java代码1.vma ni fest xmln s:a ndroid=" ndroid"packageversio n
2、Code= "1" 版本->>="com.example.a ndroid.BluetoothChat""1.0" >an droid:vers ionN ame=<uses-sdk min SdkVersi on="6" />an droid:v!- 最小的sdk v!- 权限申明->>vuses-permissi on an droid:n ame="an droid.permissio n.BLUETOOTH ADMIN" />vuses-p
3、ermissi on an droid:n ame="an droid.permissi on .BLUETOOTH"/>ame"an droid:ic on=vapplicati on an droid:label="drawable/app_ic on""stri ng/app_ nv!-默认 Activitvactivity an droid:n ame=".BluetoothChat"an droid:label= "str in g/app_ name"an droid:c on
4、 figCha nges="orie ntati on |keyboardHidde n">vinten t-filter><acti on an droid:n ame="an e nt.actio n.MAIN"/>vcategory an droid:n ame="an droid.i nten t.category.LAUNCHER"-用于显示蓝牙设备列表的/></i nten t-filter>Activity -></activity><!
5、-iceListActivity"an droid:label=theme= "a ndroid:style/Theme.Dialog" rien tati on |keyboardHidde n"/>t>vactivity an droid:n ame="stri ng/select_device"v/applicati on>an droid:c on figCha nges=v/ma nifes首先minSdkVersion用于说明该应用程序所需要使用的最小SDK版本,".Devan droid:&q
6、uot;o这里设置为6,也就是说最小需要使用android1.6 版本的sdk,同时Ophone则需要使用 o两个蓝牙操作相关的BluetoothChat (默认主 Activity )ms2.0 版本,然后打开了BLUETOOTH 和 BLUETOOTH_ADMIN权限,最后看到了两个Activity的声明,他们分别是和DeviceListActivity(显示设备列表),其中 DeviceListActivity风格被定义为一个对 话框风格,下面我们将分析该程序的每个细节。BluetoothChat首先,程序启动进入 BluetoothChat ,在on Create函数中对窗口进行了设置
7、,代 码如下:复制到剪贴板Java代码1. / 设置窗口布局requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);setCo nten tView(R .l ayout.mai n);getWi ndow().setFeaturel nt(Wi ndow.FEATURE_CUSTOM_TITLE, R.layout.custom_title);这里可以看到将窗口风格设置为自定义风格了,并且指定了自定义 title布局为custom title ,其定义代码如下:复制到剪贴板Java代码1. <RelativeLayout xmln s:a n
8、droid="s/an droid"an droid:layout_width="match_pare nt"an droid:layout_height="match_pare nt"<TextView an droid:id=an droid:gravity="+id/title_left_text""center vertical"an droid:layout_alig nPare ntLeft= gleL ine="true""true"s
9、tyle=an droid:ellipsize="?a ndroid:attr/wi ndowTitleStyle""end"an droid:s inan droid:layout_width="wrap_c on te nt"an droid:layout_height="match_parent"an droid:layout_weight="1"/>vTextView an droid:id=I!+id/title_right_text"an droid:ellipsiz
10、e="end"an droid:layout_alig nPare ntRight=an droid:s in gleL ine="true""true"an droid:layout_width="wrap_c on te nt"an droid:layout_height="match_pare nt"an droid:textColor=an droid:layout_weight="1"/></RelativeLayout>该布局将title设置为一
11、个相对布局RelativeLayout ,其中包含了两个 TextView ,一个在左边一个在右边,分别用于显示应用程序的标题title和当前的蓝牙配对链接名称,如下图所示。1*2:50 PM<iui其中左边显示为应用程序名称"BluetoothChat",右边显示一个connected : scort则表示当前配对成功正在进行聊天的链接名称。整个聊天界面的布局在main .xml 中实现,代码如下:复制到剪贴板Java代码1.<Lin earLayout xmln s:a ndroid=an droid"an droid:orie ntati on=
12、""vertical"an droid:layout_width="match_pare nt"<!-显示设备列表->an droid:layout_height=<ListView an droid:id="match_pare nt""+id/in"an droid:layout_width="match_pare nt"an droid:layout_height="match_parent"an droid:stackFromBottom=
13、"true"="alwaysScroll"送消息的编辑框->an droid:layout_weight=<Lin earLayoutan droid:tra nscriptMode"1"/><!- 显示发an droid:orie ntati on="horiz ontal"an droid:layout_width="match_pare nt"an droid:layout_height="wrap_c on te nt"<EditText
14、 an droid:id="+id/edit_text_out"an droid:layout_width="wrap_c on te nt"an droid:layout_height="wrap_c on te nt"an droid:layout_weight="1"an droid:layout_gravity= "bottom"/><Butt on an droid:id="+id/button_send"an droid:layout_width=&q
15、uot;wrap_c ontent"an droid:layout_height= "wrap_c onten t"an droid:text="stri ng/se nd"/></L inearLayout></L in earLayout>整个界面的布局将是一个线性布局LinearLayout ,其中包含了另一个ListView (用于显示聊天的对话信息)和另外一个线性布局来实现一个发送信息的窗口,发送消息 发送框有一个输入框和一个发送按钮构成。整个界面如下图所示。曲血布局好界面,下面我们需要进入编码状态,首先
16、看BluetoothChat所要那些成员变量,如下代码所示:复制到剪贴板Java代码1. public class BluetoothChatexte ndsActivity / Debugg ingprivate static final Stri ng TAG = "BluetoothChat"private static f/ 从 BluetoothChatService Handler发送的消inal boolea n D = true;息类型public static final int MESSAGE_STATE_CHANGE = 1;public static
17、 final int MESSAGE_READ = 2;public static final int MESSAGE_WRITE = 3;public static final int MESSAGE_DEVICE_NAME = 4;public static final int MESSAGE_TOAST = 5;othChatService Han dler接收消息时使用的键名/ 从 Blueto(键-值模型)public static final Stri ng DEVICE_NAME = "device_ name"tri ng TOAST = "toa
18、st"/Intent请求代码public static final S(请求链接,请求可见)private static final int REQUEST_CONNECT_DEVICE = 1; atic final int REQUEST_ENABLE_BT = 2;private ListView mCon versatio nV iew;e TextView mTitle;/ Layout Viewsprivate stprivate EditText mOutEditText;private Butt on mSe ndButt on;的设备的名称private Stri
19、ng mConn ectedDeviceName = n ull;/privat链接/ Array adapter for the con versati on thread Stri ng> mCon versatio nArrayAdapter;private ArrayAdapter</将要发送出去的字符串rivate Stri ngBuffer mOutStri ngBuffer;/本地蓝牙适配器privat我 用 明 写title BluetoothAdapter mBluetoothAdapter = null;/ 聊天服务的对象private BluetoothCha
20、tService mChatService = n ull;/其中Debugging部分则将用于我们在调试程序时通过log打印日志用,其他部分们都加入了注释,需要说明的是 BluetoothChatService,它是我们自己定义的一个来管理蓝牙的端口监听,链接,管理聊天的程序,后面我们会介绍。在这里需要说 一点,这些代码都出自google的员工之手,大豕在学习时,可以借鉴很多代码编的技巧和风格,这都将对我们有非常大的帮助。然后,我们就需要对界面进行一些设置,如下代码将用来设置我们自定义的标题 e需要显示的内容:复制到剪贴板Java代码设蓝牙1./ 设置自定义 title 布局mTitle =
21、仃extView) findViewByld(R.id.title_left_text);mTitle.setText(R.stri ng.app_ name);mTitle = (TextView) fin dViewByld(R.id. ti tle_right_text);左边的TextView被设置为显示应用程序名称,右边的则需要我们在链接之后在置更新,目前则显示没有链接字样,所以这里我们暂不设置,进一步就需要获取本地牙适配器BluetoothAdapter了,因为对于有关蓝牙的任何操作都需要首先获得该蓝适配器,获取代码非常简单,如下:复彳制到剪贴板Java代码1./ 得到一个本地蓝牙
22、适配器mBIuetoothAdapter = BluetoothAdapter.getDefaultAdapter();/如果适配器为null ,则不支持蓝牙if (mBIuetoothAdapter = n ull) Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();fini sh();return; getDefaultAdapter()函数用于获取本地蓝牙适配器,然后检测是否为null,如果为 null则表示没有蓝牙设备的支持,将通过toast告知用户。在onSta
23、rt()函数中,我们将检测蓝牙是否被打开,如果没有打开,则请求打开,否则就可以设置一些聊天信息的准备工作,代码如下:Overridepublic void on Start() super.o nStart();if(D) Log.e(TAG, "+ ON START +");/如果蓝牙没有打开,则请求打开/ setupChat() will then be called duri ng on ActivityResultif (!mBluetoothAdapter.isE nabled() In te nt en able Intent = new In te nt(Bl
24、uetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult(e nablel ntent, REQUEST_ENABLE_BT);/ 否则,设置聊天会话 else if (mChatService = n ull) setupChat();如果蓝牙没有打开,我们则通过BluetoothAdapter.ACTION_REQUEST_ENABLE来请求打开蓝牙,REQUEST_ENABLE_BT 则是我们自己定义的用于请求打开蓝牙的Intent代码,最后当我们调用startActivityForResult来执行请求时,就会在onAct
25、ivityResult函数中得到一个反馈,如果当前蓝牙已经打开,那么就可以调用setupChat函数来准备蓝牙聊天相关的工作,稍后分析该函数的具体实现。下面我们分析一下请求打开蓝牙之后,在on ActivityResult中得到的反馈信息,我们传递了REQUEST_ENABLE_BT代码作为请求蓝牙打开的命令,因此在on ActivityResult中,需要会得到一个请求代码为 如下代码所示:REQUEST_ENABLE_B的消息,对于其处理复制到剪贴板Java代码1. case REQUEST_ENABLE_BT:/在请求打开蓝牙时返回的代码2. if(resultCode = Activi
26、ty.RESULT_OK) 3. /蓝牙已经打开,所以设置一个聊天会话4. setupChat();5. else 6. /请求打开蓝牙出错7. Log.d(TAG,"BT not en abled" );8. Toast.makeText( this , R.str in g.bt_ not_en abled_leav ing, Toast.LENGTH_SHORT).show();9. fini sh();10. 在请求时,如果返回代码为Activity.RESULT_OK,则表示请求打开蓝牙成功,那么我们就可以和上面的操作进度一样,调用setupChat来设置蓝牙聊天
27、相关信息,如果返回其他代码,则表示请求打开蓝牙失败,这时我们同样通过一个Toast来告诉用户,同时也需要调用finish()函数来结束应用程序。如果打开蓝牙无误,那么下面我们开始进入setupChat的设置,其代码实现如下:复制到剪贴板Java代码/初1. private void setupChat() Log.d(TAG,"setupChat。");始化对话进程mCon versati on ArrayAdapter = new ArrayAdapter<Strin g>(this, R.l ayout.message);mCon versatio nVie
28、w = (ListView) fin dViewByld(R.id.i n);/初始化对话显示列表/设置话显示列表源mOutEditTmCon versatio nView.setAdapter(mC on versatio nArrayAdapter);mOutEditText.s/初始化发送按钮,并设置/初始化编辑框,并设置一个监听,用于处理按回车键发送消息ext = (EditText) fin dViewByld(R.id.edit_text_out); etOn EditorActio nListe ner(mWriteListe ner);事件监听mSe ndButton = (B
29、utto n) fin dViewByld(R.id.butt on _send);mSe ndButt on .setO nClickListe ner(new On ClickListe ner() public void onClick(View v) / 取得 TextView中的内容来发送消息TextView view = (TextView) fin dViewByld(R.id.edit_text_out);tri ng message = view.getText().toStri ng();sen dMessage(message););/初始化 BluetoothChatS
30、ervice并执行蓝牙连接mChatService = new BluetoothChatService(this, mHan dler);/ 初始化将要发岀的消息的字符串mOutStri ngBuffer = new Stri ngBuffer(“"); 首先构建一个对话进程mConversationArrayAdapter,然后从xml中取得用于显示对话信息的列表mConversationView,最后将列表的数据来源Adapter设置为mCon versati on ArrayAdapter,这里我们可以看至 UmCon versati on ArrayAdapter所指定的资
31、源为message.xml ,其定义实现如下:复制到剪贴板Java代码的置1.<TextView xml ns:a ndroid=" ndroid"an droid:layout_width="match_pare nt"an droid:layout_height= "wrap_c onten t"an droid:textSize="18sp"an droid:padd ing= "5dp"/>很简单,就包含了一个TextView 用来显示对话内容即可,这里设置了文字标签尺寸大小
32、textSize和padding 属性。然后我们取得了编辑框mOutEditText,用于输入聊天内容的输入框,并对其设了一个事件监听mWriteListe ner,其监听函数的实现如下:复-制到剪贴板Java代码1./ The action listener for the EditText widget, to listen for the return keyprivate TextView. On EditorActio nListe ner mWriteListe ner =new TextView. On EditorActio nListe ner() public boolea
33、 n on EditorActio n(TextView view, int acti onld, KeyEve nt eve nt) / 按下回车键并且是按键弹起的事件时发送消息if (actio nld = EditorI nfo.lME_NULL && eve nt.getActio n() = KeyEve nt.ACTION_UP) Str ing message = view.getText().toStr in g();sen dMessage(message); if(D) Log.i(TAG, "END on EditorActio n")
34、;return true; ;首先在其监听中实现了 onEditorAction 函数,我们通过判断其参数actionld 来确定事件触发的动作,其中的"EditorInfo.IME_NULL" 在Ophone中表示回车键消息,然后再加上 KeyEve nt.ACTION_UP,则表示当用户按下回车键并弹起时才触发消息的处理,处理过程也很简单,将输入框中内容取出到变量message中,然后调用sendMessage函数来发送一条消息,具体的发送细节,我们稍后分析。在setupChat函数中,我们还对发送消息的按钮进行的初始化,同样为其设置了 事件监听(setO nClick
35、Liste ner),监听的内容则也是取得输入框中的信息,然后调用sen dMessage函数来发送消息,和用户按回车键来发送消息一样。最后一个重要的操作就是初始化了BluetoothChatService 对象mChatService 用来管理蓝牙的链接,聊天的操作,并且设置了其Handler对象mHandler来负责数据的交换和线程之间的通信。另外还准备了一个空的字符串对象mOutStri ngBuffer ,用于当我们在发送消息之后,对输入框的清理。应用菜单该应用程序除了这些界面的布局之外,我们还为其设置了一个菜单,菜单包括了"扫描设备”和"使设备可见(能够被其他设备
36、所搜索到)”,创建菜单的方式有很多种,这里gogole的员工,比较喜欢和推崇使用xml布局(将界面和逻辑分开),所以我们首先看一下对于该应用程序通过xml所定义的菜单布局,代码如下:复制到剪贴板Java代码1.<me nu xml ns:a ndroid=" ndroid" ><!-扫描菜单-><item android:id="+id/scan"and这函不roid:ic on="a ndroid:drawable/ic_me nu_search"an droid:title="str in
37、g/c onn ect"/><!- 可见操作-><item an droid:id="+id/discoverable"an droid:ic on="a ndroid:drawable/ic_me nu_mylocation"an droid:title="str in g/discoverable"/></me nu>这样的疋义的确非常的清晰,我们可以随意向这个Menu中添加采单选项(itme ),里就定义了上面我们所说的两个菜单。然后再程序中通过on CreateOptio n
38、sMe nu数中来装载该采单布局,遂于采单的点击可以通过on Opti on sItemSelected函数的同参数来辨别,下面是该应用程序中对菜单选项的处理和装载菜单布局:复制到剪贴板Java代码考刖cti tyF个ivil始1./ 创建一个菜单Overridepublic boolean onCreateOptionsMenu(Me nu menu) Menuln flater in flater = getMe nuln flater();inflater.i nflate(R.me nu.opti on_menu, men u);retur n true;/ 处理菜单事件Overrid
39、epublic boolean onO ptio nsItemSelected(Me nultem item) switch (item.getltemld() case R.id.scan:/ 启动 DeviceListActivity查看设备并扫描Intent serverIntent = new Inten t(this, DeviceListActivity.class);startActivityForResult(serverl nte nt, REQUEST_CONNECT_DEVICE);return true;case R.id.discoverable:/ 确保设备处于可见
40、状态ensureDiscoverable();return true;return false;装载菜单布局的时候使用了Men ul nflater对象,整个过程很简单,大家可以参上面的代码实现,在处理菜单事件的时候,通过item.getltemld()我们可以得到当选择的菜单项的ID,首先是扫描设备(R.id.scan ),这里我们有启动了另外一个Avity来专门处理扫描设备DeviceListActivity,如果扫描之后我们将通过startActivi-orResult函数来请求链接该设备,同样我们也会在on ActivityResult函数中收到一反馈信息,命令代码为REQUEST_C
41、ONNECT_DEVICE ,如果反馈的请求代码为Actty.RESULT_OK ,则表示扫描成功(扫描过程我们稍后介绍),那么下面就可以开 准备链接了,实现代码如下:复(制到剪贴板 Java代码1. case REQUEST_CONNECT_DEVICE:/ 当 DeviceListActivity返回设备连接if (resultcode = Activity.RESULT_OK) / 从 Intent中得到设备的 MAC 地址String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS
42、);/ 得到蓝牙设备对象 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);/ 尝试连接这个设备mChatService.connect(device); break;首先我们可以通过DeviceListActivity.EXTRA_DEVICE_ADDRESS来取得设备的Mac地址,然后通过 Mac地址使用蓝牙适配器mBIuetoothAdapter 的getRemoteDevice函数来查找到该地址的设备BluetoothDevice,查询到之后我们可以通过mChatService对象的 connect来
43、链接该设备。上面我们说的是扫描蓝牙设备并链接的过程,一般蓝牙设备在打开之后都需要设置可见状态,下面我们来看一下另一个菜单选项的实现,用于使设备处于可见状态,其菜单项的 ID为R.id.discoverable,具体实现过程则位于ensureDiscoverable 函数中,其实现如下代码:复制到剪贴板Java代码1. private void ensureDiscoverable() if (D) Log.d(TAG, "ensure discoverable" );/判断扫描模式是否为既可被发现又可以被连接if (mBluetoothAdapter.getSca nMod
44、e() !=BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) / 请求可见状态Intent discoverableI nte nt = new Inten t(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);/添加附加属性,可见状态的时间discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(discoverable Inten t);这里首先通过mBIuetoot
45、hAdapter.getSca nM ode()函数取得该蓝牙的扫描模式,然后通过 BluetoothAd apter.ACTION_REQUEST_DISCOVERABLE设置可见属性,在这里我们加入一个附加属性BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,用来设置可见状态的时间,表示在指定的时间中蓝牙处于可见状态,设置好之后通过startActivity来执行即可。这里忧一个需要注意的问题,在链接某个设备之前,我们需要开启一个端口监听,该应用程序将其放在on Resume()函数中来处理了,代码如下:复制到剪贴板Java代码1. Override
46、publicsyn chro ni zedvoid on Resume() super .onResume();if (D) Log.e(TAG, "+ ON RESUME +");/ Performing this check in on Resume() covers the case in which BT was/ not en abled dur ing on Start(), so we were paused to en able it./ on Resume() will be called whe n ACTION_REQUEST_ENABLE activ
47、ity ret urns.if (mChatService != n ull) / 如果当前状态为STATE_NONE,则需要开启蓝牙聊天服务if (mChatService.getState() = BluetoothChatService.STATE_NONE) / 开始一个蓝牙聊天服务mChatService.start();首先检测mChatService 是否被初始化,然后检测其状态是否为STATE_NONE,STATE_NONE表示初始化之后处于等待的状态,当我们在setupChat函数中初始时,其实就已经将其状态设置为STATE_NONE 了(该操作是在BluetoothChat
48、Service 的构造函数中处理的),所以这里就可以通过一个start函数来启动一个进程即可,实际上就是启动了一个端口监听进程,当有设备连接时,该监听进程结束,然后转向链 接进程,链接之后同样又将转换到一个聊天管理进程。DeviceListActivit本文主要包括以下两个部分的内容:其一,分析扫描设备部分y,其二,分析具体的聊天过程的完整通信方案,包括端口监听、链接配对、消息发 送和接收等,如果有对上一篇文章不太熟悉的,可以返回去在过一次,这样会有利于 本文的理解。设备扫描(DeviceListActivity )在上一篇文章的介绍中,当用户点击了扫描按钮之后,则会执行如下代码: 复制到剪贴
49、板 Java代码1. / 启动 DeviceListActivity查看设备并扫描In te nt server Intent = new Inten t(this, DeviceListActivity.class);startActivityForResult(serverlntent, REQUEST_CONNECT_DEVICE);该代码将跳转到DeviceListActivity进行设备的扫描,并且通过REQUEST_CONNECT_DEVICE来请求链接扫描到的设备。从AndroidManifest.xml文件中我们知道 DeviceListActivity将为定义为一个对话框的风
50、格,下图是该应用程序中,扫描蓝牙设备的截图。皿业(3*整£上53申其中DeviceListActivity则为图中对话框部分,其界面的布局如下代码所示。复制到剪贴板 Java代码1.<Lin earLayout xml ns:a ndroid="an droid"an droid:orie ntati on="vertical"an droid:layout_width="match_pare nt"an droid:layout_height="match_pare nt"><!-已经
51、配对的设备->vTextView an droid:id="+id/title_paired_devices"an droid:layout_width="match_pare nt"an droid:layout_height="wrap_c onten t"an droid:text="stri ng/title_paired_devices"an droid:visibility="gone"an droid:backgrou nd="#666"an droid:
52、textColor="#fffan droid:padd in gLeft="5dp"/><!显;于一构;-已经配对的设备信息->vListView android:id="+id/paired_devices"an droid:layout_width="match_pare nt"an droid:layout_height= "wrap_c onten t"an droid:stackFromBottom="true"an droid:layout_weight
53、="1"/><!-扫描岀来没有经过配对的设备->vTextView an droid:id="+id/title_ new_devices"an droid:layout_width="match_pare nt"an droid:layout_height="wrap_c onten t"an droid:text="stri ng/title_other_devices"an droid:visibility="gon e"an droid:backgr
54、ou nd="#666"an droid:textColor="#fff"an droid:padd in gLeft="5dp"/><!-扫描岀来没有经过配对的设备信息-><ListView an droid:id="+id/new_devices"an droid:layout_width="match_pare nt"an droid:layout_height="wrap_c on tent"an droid:stackFromBottom=&
55、quot;true"an droid:layout_weight="2"/><!-扫描按钮-><Button an droid:id="+id/butt on_sca n"an droid:layout_width="match_pare nt"an droid:layout_height="wrap_c onten t"an droid:text="stri ng/butt on _sca n"/></L in earLayout>该布局整体
56、由一个线性布局Lin earLayout组成,其中包含了两个textview 中来示已经配对的设备和信扫描出来的设备(还没有经过配对)和两个ListView分别用显示已经配对和没有配对的设备的相关信息。按钮则用于执行扫描过程用,整个结 很简单,下面我们开始分析如何编码实现了。冋样开始之前,我们先确定该类中的变量的作用,定义如下:复制到剪贴板Java代码1.publicclass DeviceListActivityexte ndsActivity / Debugg ingprivate static final Stri ng TAG = "DeviceListActivity&qu
57、ot;private static final boolea n D = true;/ Retur n Intent extrapublic static String EXTRA_DEVICE_ADDRESS = "device_address"/ 蓝牙适配器private BluetoothAdapter mBtAdapter;/ 已经配对的蓝牙设备private ArrayAdapter<Stri ng> mPairedDevicesArrayAdapter;/ 新的蓝牙设备private ArrayAdapter<String> mNewDevicesArrayAdapter;其中Debugging 部分,同样用于调试,这里定义了一个EXTRA_DEVICE_ADDRESS,用于在通过 In te nt传递数据时的附加信息,即设备的地址,当扫描出来之后,返回到 BluetoothChat 中的 onActivityResult 函数的 REQUEST_CONNECT_DEVICE 命 令,这是我们就需要通过DeviceListActivity.EXTRA_DEVICE_ADDRESS来取得该设备的Mac地址,因此当我们扫描完成之后在反馈扫描结果时就需要绑定设备地址作为EXTRA_D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 导游工作总结
- 2026临床常见管道的护理
- 超声实时引导下疑难动静脉内瘘穿刺的专家共识课件
- 2026年氨基酸表面活性剂行业分析报告及未来发展趋势报告
- 2026年维生素D行业分析报告及未来发展趋势报告
- 2026年高速存储行业分析报告及未来发展趋势报告
- 生理导向心肺复苏总结2026
- 2026年激光熔覆行业分析报告及未来发展趋势报告
- 2026年鸡骨素行业分析报告及未来发展趋势报告
- 2026年磁感应电疗机行业分析报告及未来发展趋势报告
- 钢连廊吊顶及屋顶幕墙安装施工方案
- 2026年北京市顺义区高三一模语文试题
- 公司业务首单奖励制度
- 【《斯特林发动机的发展现状与趋势文献综述》1800字】
- 塔吊安拆工培训
- 常用英语不规则动词时态完全解析
- 沈阳汽车集团有限公司招聘笔试题库2026
- 环氧富锌底漆施工工艺标准及注意事项
- 深圳市2025年生地会考试卷及答案
- 2025《 化工企业变更管理实施规范》解读
- 个人简历模版(三页)带封面(可编辑)自我评价
评论
0/150
提交评论