自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android安卓的藍(lán)牙數(shù)據(jù)傳輸

移動開發(fā) Android
本文為各位詳細(xì)討論了Android的藍(lán)牙數(shù)據(jù)傳輸過程,詳盡描述了所有必需的步驟,包括設(shè)備搜尋、配對、客戶端/服務(wù)器套接字和RFCOMM通道等。

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

嘿嘿別急,在開始討論套接字和線程編程之前還需要先執(zhí)行一個基礎(chǔ)的藍(lán)牙操作,讓我們來考慮一個取巧的做法,基于安卓的一個最重要的特性:設(shè)備的默認(rèn)藍(lán)牙應(yīng)用提供的由一個給定應(yīng)用發(fā)送用戶到另一個應(yīng)用。這樣做將由安卓系統(tǒng)會替我們完成所有底層工作。

  1. import android.bluetooth.BluetoothAdapter; 
  2. //... 
  3. // 函數(shù)中代碼 
  4. // 檢查設(shè)備是否支持藍(lán)牙
  1. <!--EndFragment-->BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); 
  2.   
  3. if (btAdapter == null) { 
  4.    // 設(shè)備不支持藍(lán)牙 
  5.    // 告訴用戶我們無能為力        
  6.  } 

以上是我們需要執(zhí)行的第一次檢查。完成之后,讓我們看看它如何用我們的應(yīng)用啟動藍(lán)牙。

在過去的一篇關(guān)于手機(jī)短信編程的文章里,我們談到關(guān)于隱式意圖(Implicit Intent )允許我們指定希望系統(tǒng)處理的動作。 然后安卓會顯示一個單選列表,列出所有能夠完成我們要求的應(yīng)用。下面是一段示例代碼:

  1. // 啟動Android選擇器 
  2. Intent intent = new Intent(); 
  3. intent.setAction(Intent.ACTION_SEND); 
  4. intent.setType("text/plain"); 
  5. intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file_to_transfer) ); 
  6. //... 
  7. startActivity(intent); 

在這段代碼中,我們要求安卓系統(tǒng)發(fā)送一個文本文件。然后系統(tǒng)會顯示所有已安裝能夠處理這一意圖的活動列表,如下圖所示:

我們可以看到,這個基礎(chǔ)藍(lán)牙應(yīng)用在這個列表的最上端。我們可以點擊它,當(dāng)然也可以讓用戶選擇其他活動去完成傳送。我想,如果我們增加一點用戶友好體驗,可以自動啟動那個藍(lán)牙應(yīng)用,而不是簡單地丟出一張列表甩在用戶臉上,把它和其他不必要的應(yīng)用魚龍混雜在一起讓用戶玩找茬……要怎么做呢?

一個辦法是使用安卓的PackageManager,如下面代碼所示:

  1. // 打開對應(yīng)的列表 
  2. PackageManager pm = getPackageManager(); 
  3. List appsList = pm.queryIntentActivities( intent, 0); 
  4.   
  5. if(appsList.size() > 0 { 
  6.    // 處理 

PackageManger中的queryIntentActivities()方法返回一個列表,其中內(nèi)容正是我們前面看到的那張圖中的所有選項,用迭代器遍歷這個列表每個ResolveInfo對象里封裝著我們需要的信息:

  1. // 選擇藍(lán)牙 
  2. String packageName = null
  3. String className = null
  4. boolean found = false
  5.   
  6. for(ResolveInfo info: appsList){ 
  7.   packageName = info.activityInfo.packageName; 
  8.   if( packageName.equals("com.android.bluetooth")){ 
  9.      className = info.activityInfo.name; 
  10.      found = true
  11.      break;// 找到,結(jié)束查找 
  12.   } 
  13. if(! found){ 
  14.   Toast.makeText(this, R.string.blu_notfound_inlist, 
  15.                  Toast.LENGTH_SHORT).show(); 
  16.   // 退出 

這段代碼之后,我們擁有了自動調(diào)用藍(lán)牙活動的必要信息:

  1. // 設(shè)置啟動藍(lán)牙intent 
  2. intent.setClassName(packageName, className); 
  3. startActivity(intent); 

我們所做的是使用包和其對應(yīng)的類(在前面檢索到的)。我們會對上面的代碼很好奇,可能不知道“com.android.bluetooth”包的類名。如果我們將其打印出來會看到這些:“com.broadcom.bt.app.opp.OppLauncherActivity“OPP代表對象推送模式,是允許無線共享文件的系統(tǒng)組件。

看起來功德圓滿了,但為了上述所有代碼真正能夠使用,藍(lán)牙不僅僅需要設(shè)備支持也要由用戶在設(shè)置里啟用。那么我們想要做的第一件事情之一,就是要求用戶啟用藍(lán)牙一段時間(有多長?我們認(rèn)為必要的那么長,在這里是300秒):

  1. import android.bluetooth.BluetoothAdapter; 
  2. //... 
  3. // 設(shè)備可被發(fā)現(xiàn)持續(xù)時間
  1. inal int DISCOVER_DURATION = 300
  2.   
  3. // 請求碼<span style="font-family: Calibri;">(request code),</span><span style="font-family: 宋體;">必須大于0</span>
  1. <!--EndFragment-->private static final int REQUEST_BLU = 1
  2. //... 
  3. public void enableBlu(){ 
  4. // 啟動設(shè)備搜索——<span style="font-family: Calibri;"> </span><span style="font-family: 宋體;">這會自動啟用藍(lán)牙</span>
  1. <!--EndFragment-->Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
  2. discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 
  3.                             DISCOVER_DURATION ); 
  4. startActivityForResult(discoveryIntent, REQUEST_BLU); 

一旦我們指定我們希望從我們的活動得到一個返回值,調(diào)用startActivityForResult()用戶會看到下面的對話框:

現(xiàn)在每當(dāng)活動結(jié)束后會返回請求碼,即我們已送出的第二參數(shù):REQUEST_BLU,同時返回數(shù)據(jù)和我們的主活動通過onActivityResult()方法返回的結(jié)果碼。我們知道請求碼,因此必須核對。至于結(jié)果代碼?很簡單:如果用戶回答“否”,上述要求的權(quán)限(或如果出現(xiàn)一個錯誤),結(jié)果碼將會是RESULT_CANCELED。相反地如果用戶接受,藍(lán)牙文檔指出結(jié)果碼等于這設(shè)備處于可被發(fā)現(xiàn)狀態(tài)的(即DISCOVER_DURATION,即300)的持續(xù)時間。

處理上述藍(lán)牙對話框的代碼如下:

  1. // startActivityForResult執(zhí)行完成... 
  2. protected void onActivityResult (int requestCode, 
  3.                                  int resultCode, 
  4.                                  Intent data) { 
  5.   if (resultCode == DISCOVER_DURATION 
  6.        && requestCode == REQUEST_BLU) { 
  7.   
  8.       // 這里編寫你的代碼 
  9.   } 
  10.   else// 取消或出錯 
  11.     Toast.makeText(this, R.string.blu_cancelled, 
  12.                    Toast.LENGTH_SHORT).show(); 
  13.   } 

以下是流程圖,基本上解釋了我們在做什么:

大功告成了嗎?差不多是。最后,我們需要在Mainfest文件里請求藍(lán)牙權(quán)限:

  1. <uses-permission android:name="android.permission.BLUETOOTH" /> 
  2. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

好了,一切準(zhǔn)備妥當(dāng)。為了測試這一切,我們需要使用至少兩款安卓設(shè)備,一個用于文件發(fā)送(安裝我們的應(yīng)用程序),其他接收設(shè)備支持BT。無圖無真相,下面是幾張屏幕截圖。首先是負(fù)責(zé)發(fā)送的那臺手機(jī):

然后是對應(yīng)的接收手機(jī):

需要注意的是一旦接收這邊接受連接,接收的文件(kmemo.dat)會保存在SD卡上的BlueTooth文件夾里。所有底層數(shù)據(jù)傳輸都被安卓系統(tǒng)接管了。

原文鏈接: javacodegeeks  翻譯: ImportNew.com - xingmin
譯文鏈接: http://www.importnew.com/6333.html

責(zé)任編輯:閆佳明 來源: importnew
相關(guān)推薦

2020-06-12 07:50:15

大數(shù)據(jù)

2010-04-07 14:54:38

2014-12-04 10:28:06

藍(lán)牙

2021-12-14 11:01:44

TCPUDP網(wǎng)絡(luò)協(xié)議

2021-10-08 08:37:38

數(shù)據(jù)傳輸數(shù)據(jù)調(diào)用網(wǎng)絡(luò)協(xié)議

2010-07-13 15:55:12

FTP數(shù)據(jù)傳輸模式

2015-10-14 09:44:55

TCP網(wǎng)絡(luò)協(xié)議數(shù)據(jù)傳輸

2023-04-12 16:20:00

同步數(shù)據(jù)異步數(shù)據(jù)傳輸

2010-06-30 15:06:27

FTP數(shù)據(jù)傳輸模式

2009-04-10 23:40:06

2009-05-19 17:05:10

2011-03-04 13:22:10

FileZilla

2020-08-13 08:34:10

MySQL數(shù)據(jù)DTS

2009-12-08 11:17:41

WCF雙向通信

2009-07-07 16:46:33

數(shù)據(jù)傳輸銅纜結(jié)構(gòu)

2021-06-09 11:28:06

加密數(shù)據(jù)Jsencrypt

2019-09-06 09:11:36

以太網(wǎng)數(shù)據(jù)二層交換

2017-05-04 12:48:18

WOT網(wǎng)易NDC

2022-03-30 15:06:25

數(shù)據(jù)傳輸Harmony源碼分析

2011-03-02 11:23:48

點贊
收藏

51CTO技術(shù)棧公眾號