新聞中心
想要開發(fā)一個(gè)通過(guò)藍(lán)牙傳輸數(shù)據(jù)的安卓應(yīng)用程序,理所當(dāng)然你需要從安卓開發(fā)者的藍(lán)牙頁(yè)面開始,那里面詳盡描述了所有必需的步驟,包括設(shè)備搜尋、配對(duì)、客戶端/服務(wù)器套接字和RFCOMM通道等。

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)新建免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
嘿嘿別急,在開始討論套接字和線程編程之前還需要先執(zhí)行一個(gè)基礎(chǔ)的藍(lán)牙操作,讓我們來(lái)考慮一個(gè)取巧的做法,基于安卓的一個(gè)最重要的特性:設(shè)備的默認(rèn)藍(lán)牙應(yīng)用提供的由一個(gè)給定應(yīng)用發(fā)送用戶到另一個(gè)應(yīng)用。這樣做將由安卓系統(tǒng)會(huì)替我們完成所有底層工作。
- import android.bluetooth.BluetoothAdapter;
- //...
- // 函數(shù)中代碼
- // 檢查設(shè)備是否支持藍(lán)牙
- BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
- if (btAdapter == null) {
- // 設(shè)備不支持藍(lán)牙
- // 告訴用戶我們無(wú)能為力
- }
以上是我們需要執(zhí)行的第一次檢查。完成之后,讓我們看看它如何用我們的應(yīng)用啟動(dòng)藍(lán)牙。
在過(guò)去的一篇關(guān)于手機(jī)短信編程的文章里,我們談到關(guān)于隱式意圖(Implicit Intent )允許我們指定希望系統(tǒng)處理的動(dòng)作。 然后安卓會(huì)顯示一個(gè)單選列表,列出所有能夠完成我們要求的應(yīng)用。下面是一段示例代碼:
- // 啟動(dòng)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);
在這段代碼中,我們要求安卓系統(tǒng)發(fā)送一個(gè)文本文件。然后系統(tǒng)會(huì)顯示所有已安裝能夠處理這一意圖的活動(dòng)列表,如下圖所示:
我們可以看到,這個(gè)基礎(chǔ)藍(lán)牙應(yīng)用在這個(gè)列表的最上端。我們可以點(diǎn)擊它,當(dāng)然也可以讓用戶選擇其他活動(dòng)去完成傳送。我想,如果我們?cè)黾右稽c(diǎn)用戶友好體驗(yàn),可以自動(dòng)啟動(dòng)那個(gè)藍(lán)牙應(yīng)用,而不是簡(jiǎn)單地丟出一張列表甩在用戶臉上,把它和其他不必要的應(yīng)用魚龍混雜在一起讓用戶玩找茬……要怎么做呢?
一個(gè)辦法是使用安卓的PackageManager,如下面代碼所示:
- // 打開對(duì)應(yīng)的列表
- PackageManager pm = getPackageManager();
- List appsList = pm.queryIntentActivities( intent, 0);
- if(appsList.size() > 0 {
- // 處理
- }
PackageManger中的queryIntentActivities()方法返回一個(gè)列表,其中內(nèi)容正是我們前面看到的那張圖中的所有選項(xiàng),用迭代器遍歷這個(gè)列表每個(gè)ResolveInfo對(duì)象里封裝著我們需要的信息:
- // 選擇藍(lán)牙
- 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;// 找到,結(jié)束查找
- }
- }
- if(! found){
- Toast.makeText(this, R.string.blu_notfound_inlist,
- Toast.LENGTH_SHORT).show();
- // 退出
- }
這段代碼之后,我們擁有了自動(dòng)調(diào)用藍(lán)牙活動(dòng)的必要信息:
- // 設(shè)置啟動(dòng)藍(lán)牙intent
- intent.setClassName(packageName, className);
- startActivity(intent);
我們所做的是使用包和其對(duì)應(yīng)的類(在前面檢索到的)。我們會(huì)對(duì)上面的代碼很好奇,可能不知道“com.android.bluetooth”包的類名。如果我們將其打印出來(lái)會(huì)看到這些:“com.broadcom.bt.app.opp.OppLauncherActivity“OPP代表對(duì)象推送模式,是允許無(wú)線共享文件的系統(tǒng)組件。
看起來(lái)功德圓滿了,但為了上述所有代碼真正能夠使用,藍(lán)牙不僅僅需要設(shè)備支持也要由用戶在設(shè)置里啟用。那么我們想要做的第一件事情之一,就是要求用戶啟用藍(lán)牙一段時(shí)間(有多長(zhǎng)?我們認(rèn)為必要的那么長(zhǎng),在這里是300秒):
- import android.bluetooth.BluetoothAdapter;
- //...
- // 設(shè)備可被發(fā)現(xiàn)持續(xù)時(shí)間
- inal int DISCOVER_DURATION = 300;
- // 請(qǐng)求碼(request code),必須大于0
- private static final int REQUEST_BLU = 1;
- //...
- public void enableBlu(){
- // 啟動(dòng)設(shè)備搜索—— 這會(huì)自動(dòng)啟用藍(lán)牙
- Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
- discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
- DISCOVER_DURATION );
- startActivityForResult(discoveryIntent, REQUEST_BLU);
- }
一旦我們指定我們希望從我們的活動(dòng)得到一個(gè)返回值,調(diào)用startActivityForResult()用戶會(huì)看到下面的對(duì)話框:
現(xiàn)在每當(dāng)活動(dòng)結(jié)束后會(huì)返回請(qǐng)求碼,即我們已送出的第二參數(shù):REQUEST_BLU,同時(shí)返回?cái)?shù)據(jù)和我們的主活動(dòng)通過(guò)onActivityResult()方法返回的結(jié)果碼。我們知道請(qǐng)求碼,因此必須核對(duì)。至于結(jié)果代碼?很簡(jiǎn)單:如果用戶回答“否”,上述要求的權(quán)限(或如果出現(xiàn)一個(gè)錯(cuò)誤),結(jié)果碼將會(huì)是RESULT_CANCELED。相反地如果用戶接受,藍(lán)牙文檔指出結(jié)果碼等于這設(shè)備處于可被發(fā)現(xiàn)狀態(tài)的(即DISCOVER_DURATION,即300)的持續(xù)時(shí)間。
處理上述藍(lán)牙對(duì)話框的代碼如下:
- // startActivityForResult執(zhí)行完成...
- protected void onActivityResult (int requestCode,
- int resultCode,
- Intent data) {
- if (resultCode == DISCOVER_DURATION
- && requestCode == REQUEST_BLU) {
- // 這里編寫你的代碼
- }
- else{ // 取消或出錯(cuò)
- Toast.makeText(this, R.string.blu_cancelled,
- Toast.LENGTH_SHORT).show();
- }
- }
以下是流程圖,基本上解釋了我們?cè)谧鍪裁矗?/p>
大功告成了嗎?差不多是。最后,我們需要在Mainfest文件里請(qǐng)求藍(lán)牙權(quán)限:
好了,一切準(zhǔn)備妥當(dāng)。為了測(cè)試這一切,我們需要使用至少兩款安卓設(shè)備,一個(gè)用于文件發(fā)送(安裝我們的應(yīng)用程序),其他接收設(shè)備支持BT。無(wú)圖無(wú)真相,下面是幾張屏幕截圖。首先是負(fù)責(zé)發(fā)送的那臺(tái)手機(jī):
然后是對(duì)應(yīng)的接收手機(jī):
需要注意的是一旦接收這邊接受連接,接收的文件(kmemo.dat)會(huì)保存在SD卡上的BlueTooth文件夾里。所有底層數(shù)據(jù)傳輸都被安卓系統(tǒng)接管了。
原文鏈接: javacodegeeks 翻譯: ImportNew.com - xingmin
譯文鏈接: http://www.importnew.com/6333.html
名稱欄目:Android安卓的藍(lán)牙數(shù)據(jù)傳輸
網(wǎng)頁(yè)地址:http://m.fisionsoft.com.cn/article/coedsjj.html


咨詢
建站咨詢
