Android官方开发文档Training系列课程中文版:通过NFC共享文件之发送文件到另一台设备
原文地址:http://android.xsoftlab.net/training/beam-files/index.html
導(dǎo)言
Android允許你通過Android Beam文件傳輸特性在兩臺設(shè)備之間傳送大文件。這個特性擁有一個簡單的API,允許用戶通過簡單的設(shè)備接觸來啟動一個傳輸進(jìn)程。在響應(yīng)端,Android Beam文件傳輸系統(tǒng)會自動的將文件從一臺設(shè)備拷貝到另一臺設(shè)備上,并且會在拷貝結(jié)束時通知用戶。
雖然Android Beam文件傳輸API可以處理大量的數(shù)據(jù),但在Android 4.0之后,出現(xiàn)了Android Beam NDEF傳輸API,它可以用來處理少量的數(shù)據(jù),比如URI,或者其它的小型消息。Android Beam是Android NFC框架的唯一可用特性,它可以允許你從NFC標(biāo)簽中讀取NDEF消息。有關(guān)學(xué)習(xí)更多Android Beam的相關(guān)信息,請參見話題Beaming NDEF Messages to Other Devices。有關(guān)學(xué)習(xí)更多NFC框架的相關(guān)知識,請參見 Near Field Communication API指南。
向其它設(shè)備發(fā)送文件
這節(jié)課展示了如何設(shè)計APP通過Android Beam文件傳輸系統(tǒng)來發(fā)送一個大文件給另一臺設(shè)備。為了發(fā)送文件,你需要請求權(quán)限來使用NFC以及外部存儲器,測試確保你的設(shè)備支持NFC,以及提供URI給Android Beam文件傳輸系統(tǒng)。
Android Beam文件傳輸特性有以下要求:
- 1.對于大文件的Android Beam文件傳輸只在Android 4.1及以上設(shè)備可用。
- 2.要傳輸?shù)奈募仨毚鎯τ谕獠看鎯ζ魃稀S嘘P(guān)學(xué)習(xí)更多關(guān)于使用外部存儲器,請參見Using the External Storage。
- 3.每一個要傳輸?shù)奈募仨毷侨挚勺x。你可以通過調(diào)用File.setReadable(true,false)方法來設(shè)置這個權(quán)限。
- 4.你必須要提供一個被傳輸文件的URI。Android Beam文件傳輸系統(tǒng)不可以處理由FileProvider.getUriForFile方法產(chǎn)生的URI。
在清單文件中聲明特性
首先,需要在APP的清單文件中聲明APP所需的權(quán)限以及特性。
請求權(quán)限
為了允許用戶使用Android Beam文件傳輸系統(tǒng)使用NFC來發(fā)送外部存儲器上的文件,你必須在清單文件中請求以下權(quán)限:
NFC
允許APP通過NFC來發(fā)送數(shù)據(jù)。為了指明該權(quán)限,需要在< manifest>元素下添加如下的子元素:
<uses-permission android:name="android.permission.NFC" />READ_EXTERNAL_STORAGE
允許APP讀取外部存儲器上的文件。為了指明該權(quán)限,在< manifest>元素下添加如下的子元素:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />Note:在Android 4.2.2上,該權(quán)限不是強制要求的。未來的平臺版本可能需要它。為了確保向后兼容的完整性,在要求它之前添上它。
指明NFC特性
通過在< manifest>元素中添加子元素< uses-feature>來指明APP要使用NFC。設(shè)置其android:required屬性的值為true來指示APP不會運行,除非NFC功能出現(xiàn)。
下面的代碼展示了如何指定< uses-feature>元素:
<uses-feature android:name="android.hardware.nfc" android:required="true" />注意,如果APP只是將NFC功能作為一個選項,但是在NFC沒有出現(xiàn)的時候還仍然可用,你應(yīng)該設(shè)置android:required為false,并且在代碼中測試NFC。
指明Android Beam文件傳輸系統(tǒng)
Android Beam文件傳輸系統(tǒng)只是在Android 4.1及以上的版本可用,如果APP的關(guān)鍵部分使用了Android Beam文件傳輸系統(tǒng),你必須在< uses-sdk>元素中指明屬性android:minSdkVersion=”16”。
否則,如果有必要的話,你可以設(shè)置android:minSdkVersion的值為其它值,并在代碼中測試它的平臺版本,下節(jié)將會描述這部分。
測試是否支持Android Beam文件傳輸
為了在APP的清單文件中指明NFC功能是可選的,你需要使用以下元素:
<uses-feature android:name="android.hardware.nfc" android:required="false" />如果設(shè)置了android:required=”false”,你必須在代碼中測試是否支持NFC,以及是否支持Android Beam文件傳輸系統(tǒng)。
為了在代碼中測試Android Beam文件傳輸系統(tǒng)是否支持,首先需要通過PackageManager.hasSystemFeature()加參數(shù)FEATURE_NFC來判斷設(shè)備是否支持NFC。接下來,通過測試SDK_INT的值來判斷該平臺版本是否支持Android Beam文件傳輸系統(tǒng)。如果支持的話,則可以獲取NFC的控制器實例,該實例允許與NFC硬件設(shè)備進(jìn)行通信:
public class MainActivity extends Activity {...NfcAdapter mNfcAdapter;// Flag to indicate that Android Beam is availableboolean mAndroidBeamAvailable = false;...@Overrideprotected void onCreate(Bundle savedInstanceState) {...// NFC isn't available on the deviceif (!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);...}}... }對傳送的文件創(chuàng)建一個回調(diào)方法
一旦驗證了設(shè)備支持Android Beam文件傳輸系統(tǒng),那么需要添加一個回調(diào)方法,以便當(dāng)Android Beam文件傳輸系統(tǒng)檢查出用戶想要發(fā)送文件給另一臺NFC設(shè)備的時候系統(tǒng)可以調(diào)用這個方法。在這個回調(diào)方法中,需要返回一組Uri對象。Android Beam文件傳輸系統(tǒng)則會拷貝由這些Uri所指向的文件到接收端設(shè)備上。
為了添加這個回調(diào)方法,需要實現(xiàn)NfcAdapter.CreateBeamUrisCallback接口以及其中的方法createBeamUris()。下面這段代碼展示了如何實現(xiàn):
public class MainActivity extends Activity {...// List of URIs to provide to Android Beamprivate Uri[] mFileUris = new Uri[10];.../*** Callback that Android Beam file transfer calls to get* files to share*/private class FileUriCallback implementsNfcAdapter.CreateBeamUrisCallback {public FileUriCallback() {}/*** Create content URIs as needed to share with another device*/@Overridepublic Uri[] createBeamUris(NfcEvent event) {return mFileUris;}}... }一旦你實現(xiàn)了該接口,通過調(diào)用setBeamPushUrisCallback()方法將該回調(diào)提供給Android Beam文件傳輸系統(tǒng)。下面這段代碼展示了如何完成:
public class MainActivity extends Activity {...// Instance that returns available files from this appprivate FileUriCallback mFileUriCallback;...@Overrideprotected 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:你也可以通過APP的NfcAdapter實例直接給NFC框架提供Uri數(shù)組。如果在NFC靠近事件發(fā)生之前你可以對傳輸系統(tǒng)定義URI的話,就可以選擇這種方式。有關(guān)學(xué)習(xí)更多關(guān)于這種方式的相關(guān)知識,請參見:NfcAdapter.setBeamPushUris()。
指明發(fā)送的文件
為了給其它NFC設(shè)備傳輸文件,需要獲取每個文件的URI地址,然后將地址添加到Uri對象數(shù)組中去。為了傳輸單個文件,你還必須擁有文件的永久讀取權(quán)限。舉個例子,下面這段代碼展示了如何根據(jù)文件名來獲取文件的URI地址,并將該URI添加到數(shù)組中:
/** 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 URIsfileUri = Uri.fromFile(requestFile);if (fileUri != null) {mFileUris[0] = fileUri;} else {Log.e("My Activity", "No File URI available for file.");}總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:通过NFC共享文件之发送文件到另一台设备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: Android官方开发文档Trainin