Android官方开发文档Training系列课程中文版:通过NFC共享文件之发送文件到另一台设备

简介: 原文地址:http://android.xsoftlab.net/training/beam-files/index.html导言Android允许你通过Android Beam文件传输特性在两台设备之间传送大文件。

原文地址: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:name="android.permission.NFC" />

READ_EXTERNAL_STORAGE

允许APP读取外部存储器上的文件。为了指明该权限,在< manifest>元素下添加如下的子元素:

<uses-permission
android:name="android.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:name="android.hardware.nfc"
android:required="true" />

注意,如果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:name="android.hardware.nfc" android:required="false" />

如果设置了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 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:你也可以通过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 URIs
        fileUri = Uri.fromFile(requestFile);
        if (fileUri != null) {
            mFileUris[0] = fileUri;
        } else {
            Log.e("My Activity", "No File URI available for file.");
        }
目录
相关文章
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
1天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
8 1
|
1天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
10 1
|
1天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
7 1
|
1天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
2 0
|
2天前
|
Java Android开发
Android Mediatek 应用层重置USB设备功能
Android Mediatek 应用层重置USB设备功能
9 0
|
2天前
|
Android开发
Android Mediatek USB 核心驱动中增加设备 PID/VID 检查
Android Mediatek USB 核心驱动中增加设备 PID/VID 检查
3 0
|
10天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
1月前
|
Shell 开发工具 Android开发
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
499 2
|
2月前
|
JSON Java Go