注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/beam-files/send-files.html
這節課將向你展示如何通過Android Beam文件傳輸向另一臺設備發送大文件。要發送文件,首先需要申明使用NFC和外部存儲的權限,你需要測試一下你的設備是否支持NFC,從而能夠向Android Beam文件傳輸提供文件的URI。
使用 Android Beam文件傳輸功能有下列要求:
- Android Beam文件傳輸功能只能在Android 4.1(API Level 16)及以上使用。
-
你希望傳送的文件必須放置于外部存儲。學習更多關于外部存儲的知識,可以閱讀:
Using the External Storage
。
- 每個你希望傳送的文件必須是全局可讀的。你可以通過 File.setReadable(true,false) 來為文件設置相應的讀權限。
- 你必須提供你要傳輸文件的URI。 Android Beam文件傳輸無法處理由 FileProvider.getUriForFile 生成的URI。
一). 在清單文件中申明功能
首先,編輯你的清單文件來申明你應用申明的權限和功能。
需求權限
為了允許你的應用使用 Android Beam文件傳輸使用NFC從外部存儲發送文件,你必須在你的應用清單申明下面的權限:
允許你的應用通過NFC發送數據。為了指定該權限,添加下面的標簽作為一個 <manifest> 標簽的子標簽:
<
uses-permission
android:name
="android.permission.NFC"
/>
允許你的應用讀取外部存儲。為了指定這個權限, 添加下面的標簽作為一個 <manifest> 標簽的子標簽:
< uses-permission android:name ="android.permission.READ_EXTERNAL_STORAGE" />
Note:
對于Android 4.2.2(API Level 17),這個權限不是必需的。在后續的系統版本中,若應用需要讀取外部存儲,可能會需要申明該權限。為了保證將來程序穩定性,建議在該權限申明變成必需的之前,就在清單文件中申明好。
指定NFC功能
指定你的應用使用使用NFC, 添加 <uses-feature> 標簽作為一個 <manifest> 標簽的子標簽。設置“ android:required ”屬性字段為“ true ”,這樣可以使得你的應用只有在NFC可以使用時,才能運行。
下面的代碼展示了如何指定
<uses-feature>
標簽:
< uses-feature android:name ="android.hardware.nfc" android:required ="true" />
注意,如果你的應用將NFC作為可選的一個功能,但期望在NFC不可使用時程序還能繼續執行,你就應該設置 “ android:required ”屬性字段為“ false ”,然后再代碼中測試NFC。
指定Android Beam文件傳輸
由于Android Beam文件傳輸只能在 Android 4.1(API Level 16)及以上的平臺使用,如果你的應用將 Android Beam文件傳輸作為一個不可缺少的核心模塊,那么你必須指定 <uses-sdk> 標簽為: android:minSdkVersion ="16"。或者,你可以將 android:minSdkVersion 設置為其它值,然后再代碼中測試平臺版本,這在下一節中將展開。
二). 測試Android Beam文件傳輸是否支持
為了在你的應用清單文件中,定義NFC是可選的,你應該使用下面的標簽:
< uses-feature android:name ="android.hardware.nfc" android:required ="false" />
如果你設置了 android:required ="false",你必須再代碼中測試NFC和 Android Beam文件傳輸是否支持。
為了再代碼中測試 Android Beam文件傳輸,我們先通過 PackageManager.hasSystemFeature() 和參數 FEATURE_NFC ,來測試設備是否支持NFC。下一步,通過 SDK_INT 的值測試系統版本是否支持 Android Beam文件傳輸。如果 Android Beam文件傳輸是支持的,那么獲得一個NFC控制器的實例,它能允許你與NFC硬件進行通信,例如:
public class MainActivity extends Activity { ... NfcAdapter mNfcAdapter; // Flag to indicate that Android Beam is available boolean mAndroidBeamAvailable = false ; ... @Override protected void onCreate(Bundle savedInstanceState) { ... // NFC isn't available on the device if (! PackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)) { /* * Disable NFC features here. * For example, disable menu items or buttons that activate * NFC-related features */ ... // Android Beam file transfer isn't supported } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { // If Android Beam isn't available, don't continue. mAndroidBeamAvailable = false ; /* * Disable Android Beam file transfer features here. */ ... // Android Beam file transfer is available, continue } else { mNfcAdapter = NfcAdapter.getDefaultAdapter( this ); ... } } ... }
二). 創建一個提供文件的回調函數
一旦你確認了設備支持Android Beam文件傳輸,添加一個回調函數,當 Android Beam文件傳輸監測到用戶希望與另一個支持NFC的設備發送文件時,系統會調用。在該回調函數中,返回一個 Uri 對象數組, Android Beam文件傳輸將URI對應的文件拷貝發送給要接收的設備。
要添加這個回調函數,實現 NfcAdapter.CreateBeamUrisCallback 接口,和它的方法: createBeamUris() ,下面是一個例子:
public class MainActivity extends Activity { ... // List of URIs to provide to Android Beam private Uri[] mFileUris = new Uri[10 ]; ... /** * Callback that Android Beam file transfer calls to get * files to share */ private class FileUriCallback implements NfcAdapter.CreateBeamUrisCallback { public FileUriCallback() { } /** * Create content URIs as needed to share with another device */ @Override public Uri[] createBeamUris(NfcEvent event) { return mFileUris; } } ... }
一旦你實現了這個接口,通過調用 setBeamPushUrisCallback() 將回調函數提供給 Android Beam文件傳輸。下面是一個例子:
public class MainActivity extends Activity { ... // Instance that returns available files from this app private FileUriCallback mFileUriCallback; ... @Override protected void onCreate(Bundle savedInstanceState) { ... // Android Beam file transfer is available, continue ... mNfcAdapter = NfcAdapter.getDefaultAdapter( this ); /* * Instantiate a new FileUriCallback to handle requests for * URIs */ mFileUriCallback = new FileUriCallback(); // Set the dynamic callback for URI requests. mNfcAdapter.setBeamPushUrisCallback(mFileUriCallback, this ); ... } ... }
Note:
你也可以將 Uri 對象數組通過你應用的 NfcAdapter 實例,直接提供給NFC框架。如果你能在NFC觸碰事件發生之前,定義這些URI,那么你可以選擇這個方法。要學習關于這個方法的知識,可以閱讀: NfcAdapter.setBeamPushUris() 。
三). 定義要發送的文件
為了將一個或更多個文件發送給支持NFC的設備,為每一個文件獲取一個文件URI(一個具有文件架構(scheme)的URI),然后將它們添加至一個 Uri 對象數組。要傳輸一個文件,你必須也有讀文件的權限。例如,下面的例子展示的是你如何根據文件名獲取它的文件URI,然后將URI添加至數組當中:
/* * Create a list of URIs, get a File, * and set its permissions */ private Uri[] mFileUris = new Uri[10 ]; String transferFile = "transferimage.jpg" ; File extDir = getExternalFilesDir( null ); File requestFile = new File(extDir, transferFile); requestFile.setReadable( true , false ); // Get a URI for the File and add it to the list of URIs fileUri = Uri.fromFile(requestFile); if (fileUri != null ) { mFileUris[ 0] = fileUri; } else { Log.e( "My Activity", "No File URI available for file." ); }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
