首页 编程 软件学院 查看内容

三分钟看懂智能硬件原理——蓝牙防丢器制作教程(包括手机应用)(三)

2015-7-10 15:41 |来自: .cnblogs.com 2805 1

摘要: 操作说明:该类用来实时搜索周边蓝牙设备,并把搜索结果保存在其静态成员变量mNameVector、mAddrVector、mRSSIVector中。此外这里还使用Handler用于向调用其搜索方法的Activity发送本次搜索完毕的消息。具体介绍如下 ...
关键词: 蓝牙 android nbsp import 搜索 public 设备 Button Main Activity

操作说明:该类用来实时搜索周边蓝牙设备,并把搜索结果保存在其静态成员变量mNameVector、mAddrVector、mRSSIVector中。此外这里还使用Handler用于向调用其搜索方法的Activity发送本次搜索完毕的消息。具体介绍如下:

l  第27到42行为构造函数,主要负责成员变量初始化、注册filter、获取本地蓝牙设备; 
l  第44到65行为BroadcastReceiver,主要负责异步搜索周边蓝牙设备的广播的接收; 
l  第67到73行为开始搜索周边蓝牙设备函数; 
l  第75到83行为带有检查本地蓝牙是否开启并能够发出开启请求的搜索周边蓝牙设备函数; 
l  第85到91行为接收用户是否授权打开蓝牙设备的Activity的结果函数; 
l  第102到116行是一个线程类主要用于限定搜索周边蓝牙设备的最长时间(默认为12s左右);

  正是因为加了独立用于限定搜索时长的线程,才让搜索过程的时间长短便于我们控制,但是sleep的时间也不要设置的过小,否则会出现一个蓝牙设备也搜索不到的情况。(建议最好参照第七部分——“安卓蓝牙编程主要操作”来理解本部分的代码)

10)   修改UI_Main.java为:

复制代码
 1 package com.example.first_test;
 2 
 3 import java.util.ArrayList;
 4 import android.app.Activity;
 5 import android.content.Intent;
 6 import android.os.Bundle;
 7 import android.os.Handler;
 8 import android.os.Message;
 9 import android.view.Su**ceHolder;
10 import android.view.Su**ceHolder.Callback;
11 import android.view.Su**ceView;
12 import android.view.View;
13 import android.view.View.OnClickListener;
14 import android.widget.Button;
15 
16 public class UI_Main extends Activity implements Callback {
17 
18         public Func_Draw mFuncDraw;
19         public Su**ceHolder mHolder;
20         public static Func_BT mFuncBT;
21         // 防丢设备
22         public static ArrayList<My_BTS> mBTSArrayList = new ArrayList<My_BTS>();
23     
24         // 消息句柄(线程里无法进行界面更新,
25      // 所以要把消息从线程里发送出来在消息句柄里进行处理)
26         public Handler myHandler = new Handler() {
27             @Override
28             public void handleMessage(Message msg) {
29                 if (msg.what == 0x01) {
30                     Func_Draw.draw(mHolder);
31                 }
32                 mFuncBT.doDiscovery();
33             }
34         };
35     
36         @Override
37         protected void onCreate(Bundle savedInstanceState) {
38             super.onCreate(savedInstanceState);
39             setContentView(R.layout.ui_main);
40     
41             Func_Draw.initPaint();
42     
43             Su**ceView mSu**ce = (Su**ceView) findViewById(R.id.su**ceView);
44             mHolder = mSu**ce.getHolder();
45             mHolder.addCallback(this);
46     
47             mFuncBT = new Func_BT(this, myHandler);
48     
49             Button mButton1 = (Button) findViewById(R.id.button_start);
50             mButton1.setOnClickListener(new OnClickListener() {
51                 @Override
52                 public void onClick(View v) {
53                     Func_Draw.times = 0;
54                     mFuncBT.openBT();
55                 }
56             });
57     
58             Button mButton2 = (Button) findViewById(R.id.button_add);
59             mButton2.setOnClickListener(new OnClickListener() {
60                 @Override
61                 public void onClick(View v) {
62                     startActivity(new Intent(UI_Main.this, UI_List.class));
63                 }
64             });
65         }
66     
67         @Override
68         public void su**ceCreated(Su**ceHolder holder) {
69             // TODO Auto-generated method stub
70     
71         }
72     
73         @Override
74         public void su**ceChanged(Su**ceHolder holder, int format, int width,
75                 int height) {
76             // TODO Auto-generated method stub
77     
78         }
79     
80         @Override
81         public void su**ceDestroyed(Su**ceHolder holder) {
82             // TODO Auto-generated method stub
83     
84         }
85 }
复制代码

操作说明:上面第2步时我们修改了ui_main.xml并做出应用程序主页面的效果,而该类则是其对应的逻辑实现。

nn  首先看第37到65行的onCreate函数:

l  第39行设置要显示的页面为ui_main.xml所展示的效果; 
l  第41行调用Func_Draw的静态initPaint()方法对画笔进行初始化; 
l  第43到45行负责获取并设置Su**ceView; 
l  第47行实例化一个Func_BT; 
l  第49到56行是给开始防丢按钮绑定一个禁用词语器,一旦点击该按钮则执行onClick内代码; 
l  第58到65行是给添加蓝牙防丢器绑定一个禁用词语器,一旦点击则启动另一个Activity;

nn  第24到34行实例化一个Handler用于接收Func_BT一次搜索结束时发回结束的消息。在这里一旦收到本次周边蓝牙设备搜索结束的消息就调用Func_Draw.draw(mHolder)进行绘制,然后继续调用mFuncBT.doDiscovery()实现周期性搜索/防丢。

nn  第67到84行是自动生成的,暂且不用管(也不要删除!)。

11)   新建一个UI_List.java文件,并修改代码为:

复制代码
  1 package com.example.first_test;
  2 
  3 import java.util.ArrayList;
  4 import android.annotation.SuppressLint;
  5 import android.app.Activity;
  6 import android.app.ProgressDialog;
  7 import android.content.Intent;
  8 import android.os.Bundle;
  9 import android.os.Handler;
 10 import android.os.Message;
 11 import android.util.Log;
 12 import android.view.View;
 13 import android.view.View.OnClickListener;
 14 import android.widget.ArrayAdapter;
 15 import android.widget.Button;
 16 import android.widget.ListView;
 17 
 18 public class UI_List extends Activity {
 19 
 20         private ArrayList<String> Items;
 21         private ListView myListView;
 22         private ArrayAdapter<String> aa;
 23         private boolean getDIV;
 24     
 25         @SuppressLint("InlinedApi")
 26         protected void onCreate(Bundle savedInstanceState) {
 27             super.onCreate(savedInstanceState);
 28             setContentView(R.layout.ui_list);
 29     
 30             UI_Main.mFuncBT.setFunc_BT(this, myHandler);
 31     
 32             // 获取listview并设置为多选
 33             myListView = (ListView) findViewById(R.id.listView1);
 34             myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
 35             myListView.setTextFilterEnabled(true);
 36             // 设置listview数组并绑定
 37             Items = new ArrayList<String>();
 38             aa = new ArrayAdapter<String>(this,
 39                     android.R.layout.**_list_item_checked, Items);
 40             myListView.setAdapter(aa);
 41     
 42             // 获取OK按钮,并遍历选择的设备,返回主Activity
 43             Button myButton1 = (Button) findViewById(R.id.button_ok);
 44             myButton1.setOnClickListener(new OnClickListener() {
 45                 @Override
 46                 public void onClick(View v) {
 47                     int num = 0;
 48                     for (int i = 0; i < myListView.getCount(); i++) {
 49                         if (myListView.isItemChecked(i)) {
 50                             String item = myListView.getItemAtPosition(i)
 51                                     .toString();
 52                             String name = item.substring(0, item.indexOf("\n"));
 53                             String addr = item.substring(item.indexOf("\n") + 1);
 54                             Log.i("UI_LIST", name + " " + addr);
 55                             UI_Main.mBTSArrayList
 56                                     .add(num++, new My_BTS(name, addr));
 57                         }
 58                     }
 59                     Intent mIntent = new Intent(UI_List.this, UI_Main.class);
 60                     mIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 61                     startActivity(mIntent);
 62                 }
 63             });
 64             // 获取Search按钮,设置禁用词语事件
 65             Button myButton2 = (Button) findViewById(R.id.button_search);
 66             myButton2.setOnClickListener(new OnClickListener() {
 67                 @Override
 68                 public void onClick(View v) {
 69                     getDIV = false;
 70                     UI_Main.mFuncBT.openBT();
 71                     final ProgressDialog dialog = ProgressDialog.show(UI_List.this,
 72                             "搜索蓝牙设备", "稍等一下~", true);
 73                     new Thread(new Runnable() {
 74                         public void run() {
 75                             while (getDIV == false);
 76                             dialog.dismiss();
 77                         }
 78                     }).start();
 79                 }
 80             });
 81         }
 82     
 83         // 消息句柄(线程里无法进行界面更新,
 84      // 所以要把消息从线程里发送出来在消息句柄里进行处理)
 85         public Handler myHandler = new Handler() {
 86             @Override
 87             public void handleMessage(Message msg) {
 88                 if (msg.what == 0x01) {
 89                     Items.clear();
 90                     for (int i = 0; i < UI_Main.mFuncBT.mNameVector.size(); i++) {
 91                         Items.add(i, UI_Main.mFuncBT.mNameVector.get(i) + '\n'
 92                                 + UI_Main.mFuncBT.mAddrVector.get(i));
 93                         aa.notifyDataSetChanged();// 通知数据变化
 94                     }
 95                     getDIV = true;
 96                     UI_Main.mFuncBT.mRSSIVector.clear();
 97                     UI_Main.mFuncBT.mNameVector.clear();
 98                     UI_Main.mFuncBT.mAddrVector.clear();
 99                 }
100             }
101         };
102 }
复制代码

操作说明:这个类和ui_list.xml也是配套的。因此:

nn  在onCreate中:

l  第28行设置要显示的页面为ui_list.xml所展示的效果; 
l  第30行负责将周边蓝牙搜索对象的Handler设置为本Activity内的Handler; 
l  第32到40行是list相关; 
l  第42到80行是两个按钮点击事件禁用词语相关;

nn  第85到101行的Handler则同UI_Main.java中的Handler类似负责接收周期性蓝牙搜索结束消息。在这里当接到蓝牙搜索结束的消息后是将搜索到的设备信息放入list中待用户选择。(没有再次调用蓝牙搜索)

nn  此外两个按钮禁用词语中执行部分要特别说明下:

l  当点击OK按钮时程序将用户在list中选择的设备的信息存放在UI_Main.mBTSArrayList中,然后结束当前Activity并启动UI_Main所对应的Activity。 
l  当点击search按钮时会启动周边蓝牙设备搜索并打开一个等待对话框,其中的Thread负责等待直到搜索完毕。

12)   最后(如图8-5)找到AndroidMainFest.xml文件修改为: 

            图 8-5 AnDroidManifest.xml文件

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.first_test"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="19" <
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

返回顶部