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

原文地址: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 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);...}}...
}

对传送的文件创建一个回调方法

一旦验证了设备支持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.");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 998. 最大二叉树 II

1. 题目 向最大二叉树插入一个值&#xff1b; 如果该值大于根节点&#xff0c;则子树必须在该值的左边&#xff1b; 如果该值小于根节点&#xff0c;则该值必须在根节点的右子树 2. 解题 class Solution { public:TreeNode* insertIntoMaxTree(TreeNode* root, int val) {if(…

科大讯飞2020完整事件抽取系统(bert+数据集)

科大讯飞2020完整事件抽取系统(bert数据集) 事件抽取将非结构化文本中的事件信息展现为结构化形式&#xff0c;在舆情监测、文本摘要、自 动问答、事理图谱自动构建等领域有着重要应用。在真实新闻中&#xff0c;由于文本中可能存在句式 复杂&#xff0c;主被动转换&#xff0…

应用实践 | 网络智能运维下的知识图谱

本文转载自公众号&#xff1a;网络人工智能园地。让AI更智能&#xff0c;谷歌要用知识图谱让AI像人一样理解世界。让AI更智能&#xff0c;我们要用知识图谱让AI像网络专家一样了解网络。知识图谱引领人工智能从感知阶段演进到认知阶段&#xff0c;成为当前的热点技术之一&#…

还在买白酒?算法工程师们,量化投资了解一下

文 | 阿财知乎 本文已获作者授权&#xff0c;禁止二次转载赚取你认知中的Alpha坚持用量化的观点去看待宇宙的终极问题&#xff1a;买不买&#xff0c;卖不卖。很多人的在互联网这一片方寸之地&#xff0c;表现出来的行为是矛盾的。举个例子&#xff0c;相信技术指标在交易实践毫…

Android官方开发文档Training系列课程中文版:通过NFC共享文件之从其它设备接收文件

原文地址&#xff1a;http://android.xsoftlab.net/training/beam-files/receive-files.html Android Beam文件传输系统会将文件拷贝到接收设备的指定目录中。它还会使用Android媒体扫描器扫描被拷贝的文件&#xff0c;并会将媒体文件的入口信息添加到MediaStore提供者中去。 …

LeetCode 969. 煎饼排序

1. 题目 给定数组 A&#xff0c;我们可以对其进行煎饼翻转&#xff1a;我们选择一些正整数 k < A.length&#xff0c;然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转&#xff08;按顺序一次接一次地进行&#xff09;以完成对数组 A 的排序。 返回能使 A 排…

论文浅尝 | 用于低资源条件下知识图谱补全的关系对抗网络

论文作者: 邓淑敏&#xff0c;浙江大学在读博士&#xff0c;研究方向为低资源条件下知识图谱自动化构建关键技术研究。Ningyu Zhang, Shumin Deng, Zhanlin Sun, Jiaoyan Chen, Wei Zhang, Huajun Chen. Relation Adversarial Network for Low Resource Knowledge Graph Comple…

数据稀疏、结构复杂,事件抽取面临的挑战该如何应对?

数据稀疏、结构复杂&#xff0c;事件抽取面临的挑战该如何应对&#xff1f;

Spring Boot引起的“堆外内存泄漏”排查及经验总结

背景 为了更好地实现对项目的管理&#xff0c;我们将组内一个项目迁移到MDP框架&#xff08;基于Spring Boot&#xff09;&#xff0c;随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫去帮忙查看原因&#xff0c;发现配置了4G堆内内存&#xff0c;但是实际使用…

Facebook刷新开放域问答SOTA:模型训模型!Reader当Teacher!

文 | Sherry 不是小哀编 | 小轶一部问答系统发展史就是一部人工智能发展史。早在1950年的图灵测试就提出&#xff1a;如果人类无法通过问答将机器和人区分开&#xff0c;那么这个机器就可以被认为具有智能。问答系统和人工智能有着密不可分的关系。从基于规则和结构化数据的自动…

Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放

原文地址&#xff1a;http://android.xsoftlab.net/training/managing-audio/index.html 引言 如果APP需要播放音频&#xff0c;允许用户可以控制音频的播放状态是很重要的一点。为了保证有极佳的用户体验&#xff0c;还有很重要的一点就是&#xff0c;APP需要管理音频的焦点…

LeetCode 1038. 从二叉搜索树到更大和树(逆中序-右根左-降序)

1. 题目 2. 解题 二叉搜索树 逆中序遍历&#xff08;右根左&#xff09;是降序的 class Solution { public:TreeNode* bstToGst(TreeNode* root) {stack<TreeNode*> stk;int sum 0;TreeNode *rootcopy root;while(root || !stk.empty()) {while(root){stk.push(root);…

Inode 导致 电脑的网络适配器和访问点出现问题

1 电脑好好的&#xff0c;由于项目原因需要安装inode去访问外网的数据集。安装好inode没有什么问题&#xff0c;网络依然可以用。然后不小心重启了一下电脑&#xff0c;发现电脑所有的网络均不正常。网络诊断是电脑的适配器和访问点出现故障。根据网络上的解决方案&#xff0c;…

应用实践 | 南方科技大学研发基于新型冠状病毒知识图谱模式挖掘系统

本文转载自公众号&#xff1a;南方科技大学计算机科学与工程系。随着新型冠状病毒疫情的不断发展&#xff0c;有关疫情的各类信息也在不断更新&#xff0c;如何利用知识图谱从大量新型冠状病毒肺炎信息中高效挖掘相关频繁模式&#xff08;如病毒的宿主、传播途径&#xff09;成…

java.lang.NoClassDefFoundError: * : Landroid/support/v7/gridlayout/R$styleable 异常终极解决办法

该问题解决办法适用于任何类似问题。 问题的标准异常描述为&#xff1a;java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/gridlayout/R$styleable 今天由于项目需要&#xff0c;想在项目中使用GridLayout&#xff0c;无奈&#xff0c;标准库中的…

训练一个130亿参数的模型要用几个GPU?微软:一个就够

文&#xff5c;蛋酱、张倩源&#xff5c;机器之心现在的模型动辄数百、数千亿参数&#xff0c;普通人训不动怎么办&#xff1f;前不久&#xff0c;谷歌发布了参数量为 1.6 万亿的语言模型Swith Transformer&#xff0c;将 GPT-3 创下的参数量记录&#xff08;1750 亿&#xff0…

技术年货:美团技术沙龙合辑大放送——85个演讲,70+小时视频

你好&#xff0c;2019 再见&#xff0c;2018 又到了一年辞旧迎新的时候&#xff0c;大家应该也和美美一样&#xff0c;在忙着总结回顾和展望规划吧。 按老惯例&#xff0c;我们该献上技术年货了。今年首先出场的&#xff0c;是我们的技术沙龙大套餐&#xff01; 美团技术沙龙是…

LeetCode 442. 数组中重复的数据

1. 题目 给定一个整数数组 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n为数组长度&#xff09;, 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗&#xff1f; 示例&#xff1a;输入:…

如何恢复在 PyCharm 中误删的整个项目文件

如何恢复在 PyCharm 中误删的整个项目文件 方案1: 在误删项目的原始文件地址下新建相同文件名的空文件夹,即新文件夹与被误删项目的路径相同. 在 PyCharm 中打开该新文件夹,右键文件夹,点击 Local History 下的 Show History. 页面左侧为删除的文件信息(时间等),点击文件名右…

Android官方开发文档Training系列课程中文版:管理音频播放之管理音频焦点

原文地址&#xff1a;http://android.xsoftlab.net/training/managing-audio/audio-focus.html 因为可能会存在多个APP播放音频&#xff0c;所以考虑它们之间的交互方式是一件很重要的事情。为了避免多个音乐播放器APP在同一时间播放音乐&#xff0c;Android使用了音频焦点的方…