---恢复内容开始---html
想要开发一个经过蓝牙传输数据的安卓应用程序,理所固然你须要从安卓开发者的蓝牙页面开始,那里面详尽描述了全部必需的步骤,包括设备搜寻、配对、客户端/服务器套接字和RFCOMM通道等。java
嘿,嘿,别急,在开始讨论套接字和线程编程以前还须要先执行一个基础的蓝牙操做,让咱们来考虑一个取巧的作法,基于安卓的一个最重要的特性:设备的默认蓝牙应用提供的由一个给定应用发送用户到另外一个应用。这样作将由安卓系统会替咱们完成全部底层工做。android
import android.bluetooth.BluetoothAdapter; //... // 函数中代码 // 检查设备是否支持蓝牙
<!--EndFragment-->BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); if (btAdapter == null) { // 设备不支持蓝牙 // 告诉用户咱们无能为力 }
以上是咱们须要执行的第一次检查。完成以后,让咱们看看它如何用咱们的应用启动蓝牙。编程
在过去的一篇关于手机短信编程的文章里,咱们谈到关于隐式意图(Implicit Intent )容许咱们指定但愿系统处理的动做。 而后安卓会显示一个单选列表,列出全部可以完成咱们要求的应用。下面是一段示例代码:服务器
// 启动Android选择器 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file_to_transfer) ); //... startActivity(intent);
在这段代码中,咱们要求安卓系统发送一个文本文件。而后系统会显示全部已安装可以处理这一意图的活动列表,以下图所示:app
咱们能够看到,这个基础蓝牙应用在这个列表的最上端。咱们能够点击它,固然也可让用户选择其余活动去完成传送。我想,若是咱们增长一点用户友好体验,能够自动启动那个蓝牙应用,而不是简单地丢出一张列表甩在用户脸上,把它和其余没必要要的应用鱼龙混杂在一块儿让用户玩找茬……要怎么作呢?ide
一个办法是使用安卓的PackageManager,以下面代码所示:wordpress
// 打开对应的列表 PackageManager pm = getPackageManager(); List appsList = pm.queryIntentActivities( intent, 0); if(appsList.size() > 0 { // 处理 }
PackageManger中的queryIntentActivities()方法返回一个列表,其中内容正是咱们前面看到的那张图中的全部选项,用迭代器遍历这个列表每一个ResolveInfo对象里封装着咱们须要的信息:函数
// 选择蓝牙 String packageName = null; String className = null; boolean found = false; for(ResolveInfo info: appsList){ packageName = info.activityInfo.packageName; if( packageName.equals("com.android.bluetooth")){ className = info.activityInfo.name; found = true; break;// 找到,结束查找 } } if(! found){ Toast.makeText(this, R.string.blu_notfound_inlist, Toast.LENGTH_SHORT).show(); // 退出 }
这段代码以后,咱们拥有了自动调用蓝牙活动的必要信息:测试
// 设置启动蓝牙intent intent.setClassName(packageName, className); startActivity(intent);
咱们所作的是使用包和其对应的类(在前面检索到的)。咱们会对上面的代码很好奇,可能不知道“com.android.bluetooth”包的类名。若是咱们将其打印出来会看到这些:“com.broadcom.bt.app.opp.OppLauncherActivity“OPP表明对象推送模式,是容许无线共享文件的系统组件。
看起来功德圆满了,但为了上述全部代码真正可以使用,蓝牙不只仅须要设备支持也要由用户在设置里启用。那么咱们想要作的第一件事情之一,就是要求用户启用蓝牙一段时间(有多长?咱们认为必要的那么长,在这里是300秒):
import android.bluetooth.BluetoothAdapter; //... // 设备可被发现持续时间
<!--EndFragment-->private static final int DISCOVER_DURATION = 300; // 请求码<span style="font-family: Calibri;">(request code),</span><span style="font-family: 宋体;">必须大于0</span>
<!--EndFragment-->private static final int REQUEST_BLU = 1; //... public void enableBlu(){ // 启动设备搜索——<span style="font-family: Calibri;"> </span><span style="font-family: 宋体;">这会自动启用蓝牙</span>
<!--EndFragment-->Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISCOVER_DURATION ); startActivityForResult(discoveryIntent, REQUEST_BLU); }
一旦咱们指定咱们但愿从咱们的活动获得一个返回值,调用startActivityForResult()用户会看到下面的对话框:
如今每当活动结束后会返回请求码,即咱们已送出的第二参数:REQUEST_BLU,同时返回数据和咱们的主活动经过onActivityResult()方法返回的结果码。咱们知道请求码,所以必须核对。至于结果代码?很简单:若是用户回答“否”,上述要求的权限(或若是出现一个错误),结果码将会是RESULT_CANCELED。相反地若是用户接受,蓝牙文档指出结果码等于这设备处于可被发现状态的(即DISCOVER_DURATION,即300)的持续时间。
处理上述蓝牙对话框的代码以下:
// startActivityForResult执行完成... protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (resultCode == DISCOVER_DURATION && requestCode == REQUEST_BLU) { // 这里编写你的代码 } else{ // 取消或出错 Toast.makeText(this, R.string.blu_cancelled, Toast.LENGTH_SHORT).show(); } }
如下是流程图,基本上解释了咱们在作什么:
大功告成了吗?差很少是。最后,咱们须要在Mainfest文件里请求蓝牙权限:
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
好了,一切准备稳当。为了测试这一切,咱们须要使用至少两款安卓设备,一个用于文件发送(安装咱们的应用程序),其余接收设备支持BT。无图无真相,下面是几张屏幕截图。首先是负责发送的那台手机:
而后是对应的接收手机:
须要注意的是一旦接收这边接受链接,接收的文件(kmemo.dat)会保存在SD卡上的BlueTooth文件夹里。全部底层数据传输都被安卓系统接管了。
版权声明:原文连接: javacodegeeks 首发于: ImportNew.com - by 邢 敏。欢迎关注个人weibo:http://weibo.com/laowangba