---恢復內容開始---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