虚拟主机如何建设多个网站,wordpress阅读数,wordpress视频自动播放,中国铁建最新消息原文地址#xff1a;http://android.xsoftlab.net/training/beam-files/index.html
导言
Android允许你通过Android Beam文件传输特性在两台设备之间传送大文件。这个特性拥有一个简单的API#xff0c;允许用户通过简单的设备接触来启动一个传输进程。在响应端#xff0c;…原文地址http://android.xsoftlab.net/training/beam-files/index.html
导言
Android允许你通过Android Beam文件传输特性在两台设备之间传送大文件。这个特性拥有一个简单的API允许用户通过简单的设备接触来启动一个传输进程。在响应端Android Beam文件传输系统会自动的将文件从一台设备拷贝到另一台设备上并且会在拷贝结束时通知用户。
虽然Android Beam文件传输API可以处理大量的数据但在Android 4.0之后出现了Android Beam NDEF传输API它可以用来处理少量的数据比如URI或者其它的小型消息。Android Beam是Android NFC框架的唯一可用特性它可以允许你从NFC标签中读取NDEF消息。有关学习更多Android Beam的相关信息请参见话题Beaming NDEF Messages to Other Devices。有关学习更多NFC框架的相关知识请参见 Near Field Communication API指南。
向其它设备发送文件
这节课展示了如何设计APP通过Android Beam文件传输系统来发送一个大文件给另一台设备。为了发送文件你需要请求权限来使用NFC以及外部存储器测试确保你的设备支持NFC以及提供URI给Android Beam文件传输系统。
Android Beam文件传输特性有以下要求
1.对于大文件的Android Beam文件传输只在Android 4.1及以上设备可用。2.要传输的文件必须存储于外部存储器上。有关学习更多关于使用外部存储器请参见Using the External Storage。3.每一个要传输的文件必须是全局可读。你可以通过调用File.setReadable(true,false)方法来设置这个权限。4.你必须要提供一个被传输文件的URI。Android Beam文件传输系统不可以处理由FileProvider.getUriForFile方法产生的URI。
在清单文件中声明特性
首先需要在APP的清单文件中声明APP所需的权限以及特性。
请求权限
为了允许用户使用Android Beam文件传输系统使用NFC来发送外部存储器上的文件你必须在清单文件中请求以下权限
NFC
允许APP通过NFC来发送数据。为了指明该权限需要在 manifest元素下添加如下的子元素
uses-permission android:nameandroid.permission.NFC /
READ_EXTERNAL_STORAGE
允许APP读取外部存储器上的文件。为了指明该权限在 manifest元素下添加如下的子元素
uses-permission
android:nameandroid.permission.READ_EXTERNAL_STORAGE / Note:在Android 4.2.2上该权限不是强制要求的。未来的平台版本可能需要它。为了确保向后兼容的完整性在要求它之前添上它。 指明NFC特性
通过在 manifest元素中添加子元素 uses-feature来指明APP要使用NFC。设置其android:required属性的值为true来指示APP不会运行除非NFC功能出现。
下面的代码展示了如何指定 uses-feature元素
uses-feature
android:nameandroid.hardware.nfc
android:requiredtrue /
注意如果APP只是将NFC功能作为一个选项但是在NFC没有出现的时候还仍然可用你应该设置android:required为false并且在代码中测试NFC。
指明Android Beam文件传输系统
Android Beam文件传输系统只是在Android 4.1及以上的版本可用如果APP的关键部分使用了Android Beam文件传输系统你必须在 uses-sdk元素中指明属性android:minSdkVersion”16”。 否则如果有必要的话你可以设置android:minSdkVersion的值为其它值并在代码中测试它的平台版本下节将会描述这部分。
测试是否支持Android Beam文件传输
为了在APP的清单文件中指明NFC功能是可选的你需要使用以下元素
uses-feature android:nameandroid.hardware.nfc android:requiredfalse /
如果设置了android:required”false”你必须在代码中测试是否支持NFC以及是否支持Android Beam文件传输系统。
为了在代码中测试Android Beam文件传输系统是否支持首先需要通过PackageManager.hasSystemFeature()加参数FEATURE_NFC来判断设备是否支持NFC。接下来通过测试SDK_INT的值来判断该平台版本是否支持Android Beam文件传输系统。如果支持的话则可以获取NFC的控制器实例该实例允许与NFC硬件设备进行通信
public class MainActivity extends Activity {...NfcAdapter mNfcAdapter;// Flag to indicate that Android Beam is availableboolean mAndroidBeamAvailable false;...Overrideprotected void onCreate(Bundle savedInstanceState) {...// NFC isnt 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 isnt supported} else if (Build.VERSION.SDK_INT Build.VERSION_CODES.JELLY_BEAN_MR1) {// If Android Beam isnt available, dont 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 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;}}...
}
一旦你实现了该接口通过调用setBeamPushUrisCallback()方法将该回调提供给Android Beam文件传输系统。下面这段代码展示了如何完成
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数组。如果在NFC靠近事件发生之前你可以对传输系统定义URI的话就可以选择这种方式。有关学习更多关于这种方式的相关知识请参见NfcAdapter.setBeamPushUris()。 指明发送的文件
为了给其它NFC设备传输文件需要获取每个文件的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 URIsfileUri Uri.fromFile(requestFile);if (fileUri ! null) {mFileUris[0] fileUri;} else {Log.e(My Activity, No File URI available for file.);}