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

原文地址:http://android.xsoftlab.net/training/beam-files/receive-files.html

Android Beam文件传输系统会将文件拷贝到接收设备的指定目录中。它还会使用Android媒体扫描器扫描被拷贝的文件,并会将媒体文件的入口信息添加到MediaStore提供者中去。

响应展示数据的请求

当Android Beam文件传输系统结束了文件拷贝,它会发送通知,这个通知会包含一个Intent对象,这个Intent对象的行为为ACTION_VIEW,以及被传送的第一个文件的MIME类型,以及指向第一个文件的URI地址。当用户点击了通知,这个Intent会被广播到系统中。为了使APP可以响应这个意图,需要在清单文件中的响应Activity的< activity>元素下添加元素,并在其中添加如下子元素:

<action android:name="android.intent.action.VIEW" />
  • 匹配由通知发送来的ACTION_VIEW意图。
<category android:name="android.intent.category.CATEGORY_DEFAULT" />
  • 匹配没有明确类别的意图。
<data android:mimeType="mime-type" />
  • 匹配一种MIME类型。这里的mime-type类型应为APP可以处理的类型。

举个例子,下面这段代码展示了如何在被触发的Activity com.example.android.nfctransfer.ViewActivity的清单文件中添加意图过滤器:

    <activity
        android:name="com.example.android.nfctransfer.ViewActivity"android:label="Android Beam Viewer" >...<intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/>...</intent-filter></activity>

**Note:**Android Beam文件传输系统并不是ACTION_VIEW意图的唯一来源,接收设备上的其它APP也可以发送含有这个行为的意图。Get the directory from a content URI这节会讨论如何处理这种情况。

请求文件权限

为了可以读取Android Beam文件传输系统拷贝到设备的文件,需要请求READ_EXTERNAL_STORAGE权限:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果你想要将被拷贝的文件拷贝到自己的存储器上,这里应该使用权限WRITE_EXTERNAL_STORAGE。WRITE_EXTERNAL_STORAGE权限包含了READ_EXTERNAL_STORAGE权限。

Note:在Android 4.2.2上,READ_EXTERNAL_STORAGE权限会在用户需要的时候强制执行。未来的版本可能在各种情况下都需要该权限,所以为了确保向后兼容,请在它要求以前就给它添加上。

因为你的APP对其内部存储器有操作的权利,所以在拷贝文件到内部存储器上时不需要请求写入权限。

获取被拷贝文件的目录

Android Beam文件传输系统会通过一个单一的传输通道将所有的文件拷贝到接收设备上一个目录中。Android Beam文件传输系统的通知会将内容Intent中的URI指向到第一个已被传送的文件上。然而,APP可能还需要对传输系统上的其它ACTION_VIEW意图来源进行接收。为了判断应该如何处理发送过来的Intent,你需要检查它的计划(scheme)与权力(authority)。

为了可以从URI上获取计划,需要调用Uri.getScheme()方法。下面这段代码展示了如何检查计划以及如何处理URI的访问:

public class MainActivity extends Activity {...// A File object containing the path to the transferred filesprivate File mParentPath;// Incoming Intentprivate Intent mIntent;.../** Called from onNewIntent() for a SINGLE_TOP Activity* or onCreate() for a new Activity. For onNewIntent(),* remember to call setIntent() to store the most* current Intent**/private void handleViewIntent() {...// Get the Intent actionmIntent = getIntent();String action = mIntent.getAction();/** For ACTION_VIEW, the Activity is being asked to display data.* Get the URI.*/if (TextUtils.equals(action, Intent.ACTION_VIEW)) {// Get the URI from the IntentUri beamUri = mIntent.getData();/** Test for the type of URI, by getting its scheme value*/if (TextUtils.equals(beamUri.getScheme(), "file")) {mParentPath = handleFileUri(beamUri);} else if (TextUtils.equals(beamUri.getScheme(), "content")) {mParentPath = handleContentUri(beamUri);}}...}...
}

从文件URI获取目录

如果接收到的Intent包含一个文件URI,那么URI会包含文件的绝对文件名,包括全目录路径以及文件的名字。对Android Beam文件传输系统来说,如果有的话,这个目录路径指向了其它被传送文件的位置。为了获取目录路径,获取URI的路径部分,路径部分包含了除了前缀file:之外的所有URI。从路径部分创建一个File对象,然后该文件对象的上级目录:

    ...public String handleFileUri(Uri beamUri) {// Get the path part of the URIString fileName = beamUri.getPath();// Create a File object for this filenameFile copiedFile = new File(fileName);// Get a string containing the file's parent directoryreturn copiedFile.getParent();}...

从内容URI获取目录

如果接收到的Intent包含一个内容URI,那这个URI可能会指向在MediaStore内容提供者中存储的文件的路径和名称。你可以通过测试URI的权限值来判断是否是MediaStore的内容URI。MediaStore的内容URI可能来自Android Beam文件传输系统或者其它APP,但是无论什么情况你都可以从内容URI中接收一个目录以及文件的名称。

你也可以接收包含了不同于MediaStore的内容URI的ACTION_VIEW意图。在这种情况下,这内容URI不包含 ACTION_VIEW的权限值,以及内容URI通常不会执行一个目录。

Note: 对于Android Beam文件传输系统来说,你可以接收含有内容URI的ACTION_VIEW意图,如果第一个接到的文件含有”audio/*”, “image/*”, 或者”video/*”之类的MIME类型。这意味着它是和媒体有关的。Android Beam文件传输系统会索引媒体文件,它会通过运行媒体扫描器扫描存储有被传送文件的目录来传送文件。媒体扫描器会将扫描结果写入到MediaStore内容提供者中,然后它会传第一个文件的内容URI给Android Beam文件传输系统。这个内容URI是在通知意图中的接收到的那个。给了获取第一个文件的目录,需要使用内容URI从MediaStore中接收它。

判断内容提供者

为了判断是否可以从内容URI中接收文件的目录,通过调用Uri.getAuthority()来获取URI的权限来判断与内容提供者相关联的URI。它的值可能有两种情况:

MediaStore.AUTHORITY

这个URI是可以被MediaStore追踪到的单个文件或者多个文件。MediaStore中可以接收全路径名称,以及可以从文件名中获取它的目录。

其它任意的权限值

从其它内容提供者而来的内容URI。展示了与内容URI相关的数据,但是不能够获取文件的目录。

为了可以从MediaStore内容URI中获取文件目录,需要进行查询,查询需要指定Uri参数为接收到的内容URI,projection参数为列MediaColumns.DATA,它返回的Cursor对象包含了URI所代表的文件的全路径名称。这个路径还包含Android Beam文件传输系统刚刚拷贝到设备上的其它所有文件。

下面这段代码展示了如何测试内容URI的权限以及从被传送的文件中接收路径以及文件名:

    ...public String handleContentUri(Uri beamUri) {// Position of the filename in the query Cursorint filenameIndex;// File object for the filenameFile copiedFile;// The filename stored in MediaStoreString fileName;// Test the authority of the URIif (!TextUtils.equals(beamUri.getAuthority(), MediaStore.AUTHORITY)) {/** Handle content URIs for other content providers*/// For a MediaStore content URI} else {// Get the column that contains the file nameString[] projection = { MediaStore.MediaColumns.DATA };Cursor pathCursor =getContentResolver().query(beamUri, projection,null, null, null);// Check for a valid cursorif (pathCursor != null &&pathCursor.moveToFirst()) {// Get the column index in the CursorfilenameIndex = pathCursor.getColumnIndex(MediaStore.MediaColumns.DATA);// Get the full file name including pathfileName = pathCursor.getString(filenameIndex);// Create a File object for the filenamecopiedFile = new File(fileName);// Return the parent directory of the filereturn new File(copiedFile.getParent());} else {// The query didn't work; return nullreturn null;}}}...

如果要学习更多从内容提供者中接收数据的其它知识,请参见章节:Retrieving Data from the Provider.

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

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

相关文章

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使用了音频焦点的方…

征稿 | ​2020年全国知识图谱与语义计算大会

China Conference on Knowledge Graph and Semantic Computing(CCKS 2020)www.sigkg.cn/ccks2020征稿启事&#xff08;第二轮&#xff09;2020年8月15日-18日&#xff0c;南昌征稿截止: 2020年5月21日第十四届全国知识图谱与语义计算大会&#xff08;CCKS: China Conference o…

新手福利:百度官方中文教程,过年也要深度学习!

很多小伙伴在后台给我留言&#xff0c;零基础如何入门深度学习&#xff1f;想要做算法工程师&#xff0c;自学了python基础&#xff0c;现在还来得及吗&#xff1f;这个问题很大。很难说一篇文章几句话就能解决这个问题。今天我给大家说一下自己的一些个人经验&#xff0c;比较…

LeetCode 232. 用栈实现队列(双栈法-队列)

1. 题目 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://le…

Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理

原文地址&#xff1a;http://android.xsoftlab.net/training/managing-audio/audio-output.html 当用户使用Android设备享受音频时&#xff0c;它有多重的可选择替代方案。大多数的设备内置了一套音频系统&#xff1a;扬声器以及有线耳机的耳机插孔&#xff0c;也有很多功能蓝…

pytorch-pretrained-bert的模型下载慢的问题

原文地址&#xff1a;https://blog.csdn.net/w5688414/article/details/103666409 今天需要用到pytorch-pretained-bert&#xff0c;但是下载预训练的模型花费了好长时间&#xff0c;这里来分享以下解决方法&#xff0c;其安装过程为&#xff1a; pip install pytorch-pretrain…