Android官方开发文档Training系列课程中文版:分享文件之分享一个文件

原文地址:http://android.xsoftlab.net/training/secure-file-sharing/share-file.html

一旦APP设置通过URI的方式共享文件,你需要响应其它APP请求这些文件的请求。响应这些请求的一种方式是,在服务端APP上提供一个文件选择接口,以便其它的程序可以调用。这种方法允许客户端程序的用户从服务端选择一个文件,然后接收被选择文件的URI地址。

这节课展示了如何在Activity中创建文件选择功能,以便响应文件请求。

接收文件请求

为了接收客户端APP的文件请求,以及以URI的方式作出响应,APP应该在Activity中提供文件选择器。这样的话,客户端APP可以通过调用startActivityForResult()方法启动这个Activity。当客户端调用了startActivityForResult()方法,你的APP可以返回一个结果给客户端APP,这个结果以URI的形式将用户选择的文件返回。

有关学习如何在客户端APP中实现文件的请求,请参见课程: Requesting a Shared File。

创建一个文件选择器Activity

为了设置文件选择器Activity,首选需要在清单文件中指定activity,并在其中附加意图过滤器,这个意图过滤器用来匹配行为ACTION_PICK以及类别CATEGORY_DEFAULT和CATEGORY_OPENABLE。还要给服务端给客户端提供的文件添加MIME类型过滤器。下面的代码片段展示了如何指定一个新Activity以及过滤器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">...<application>...<activity
                android:name=".FileSelectActivity"android:label="@"File Selector" ><intent-filter><action
                        android:name="android.intent.action.PICK"/><category
                        android:name="android.intent.category.DEFAULT"/><category
                        android:name="android.intent.category.OPENABLE"/><data android:mimeType="text/plain"/><data android:mimeType="image/*"/></intent-filter></activity>

在代码中定义文件选择器

接下来,定义一个Activity来展示内部存储器中files/images/目录下的可用文件,并允许用户来选择需要的文件。下面这段代码演示了如何定义一个Activity来响应用户的选择:

public class MainActivity extends Activity {// The path to the root of this app's internal storageprivate File mPrivateRootDir;// The path to the "images" subdirectoryprivate File mImagesDir;// Array of files in the images subdirectoryFile[] mImageFiles;// Array of filenames corresponding to mImageFilesString[] mImageFilenames;// Initialize the Activity@Overrideprotected void onCreate(Bundle savedInstanceState) {...// Set up an Intent to send back to apps that request a filemResultIntent =new Intent("com.example.myapp.ACTION_RETURN_FILE");// Get the files/ subdirectory of internal storagemPrivateRootDir = getFilesDir();// Get the files/images subdirectory;mImagesDir = new File(mPrivateRootDir, "images");// Get the files in the images subdirectorymImageFiles = mImagesDir.listFiles();// Set the Activity's result to null to begin withsetResult(Activity.RESULT_CANCELED, null);/** Display the file names in the ListView mFileListView.* Back the ListView with the array mImageFilenames, which* you can create by iterating through mImageFiles and* calling File.getAbsolutePath() for each File*/...}...
}

响应文件选择器

一旦用户选择了被共享的文件,你的程序必须检查哪一个文件被选中,并且生成该文件的URI地址。前面的部分Activity在ListView中展示了可用的文件列表,当用户点击了文件的名称,随之系统会调用方法onItemClick(),在这个方法中你可以获取到被选中的文件。

在onItemClick()方法中,从被选择的文件中获得文件的File对象,然后将这个对象作为参数传递给getUriForFile(),它会伴随着权限一并加入,这个权限是由 < provider>元素指定的。结果URI会包含权限、文件在相应目录中的路径段(在XML meta-data中指定的部分)以及文明的名称和其扩展部分。有关FileProvider如何映射meta-data与路径段的目录,请看章节Specify Sharable Directories。

下面的代码段展示了如何检测被选择的文件以及获取该文件的URI:

    protected void onCreate(Bundle savedInstanceState) {...// Define a listener that responds to clicks on a file in the ListViewmFileListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Override/** When a filename in the ListView is clicked, get its* content URI and send it to the requesting app*/public void onItemClick(AdapterView<?> adapterView,View view,int position,long rowId) {/** Get a File for the selected file name.* Assume that the file names are in the* mImageFilename array.*/File requestFile = new File(mImageFilename[position]);/** Most file-related method calls need to be in* try-catch blocks.*/// Use the FileProvider to get a content URItry {fileUri = FileProvider.getUriForFile(MainActivity.this,"com.example.myapp.fileprovider",requestFile);} catch (IllegalArgumentException e) {Log.e("File Selector","The selected file can't be shared: " +clickedFilename);}...}});...}

要记住,你只可以对在< paths>元素中指定目录下的文件进行URI编码,就像Specify Sharable Directories这节课中描述的一样。如果你对getUriForFile()方法中传入的File参数并没有在< path>元素中指定,那么你会收到一个 IllegalArgumentException异常。

对文件授予权限

现在对将要分享的文件有了一个URI,你需要允许客户端APP来访问这个文件。为了允许访问,需要通过添加URI到一个Intent上,并且在这个Intent上设置权限标志。产生的这个权限是个临时权限,并且会在接收端APP任务结束的时候自动终止。

下面这段代码展示了如何对文件设置读取权限:

    protected void onCreate(Bundle savedInstanceState) {...// Define a listener that responds to clicks in the ListViewmFileListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView,View view,int position,long rowId) {...if (fileUri != null) {// Grant temporary read permission to the content URImResultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);}...}...});...}

Caution:安全的对文件授予临时访问权限,setFlags()是唯一的方式。要避免对文件的URI使用Context.grantUriPermission()方法,因为该方法授予的权限只可以通过Context.revokeUriPermission()方法撤销。

对客户端APP共享文件

如果要共享文件给客户端APP,需要传递一个Intent给setResult(),这个Intent包含了文件的URI以及访问权限。当你定义的这个Activity结束时,系统会发送这个Intent给客户端APP,下面这段代码展示了如何实现这部分功能:

    protected void onCreate(Bundle savedInstanceState) {...// Define a listener that responds to clicks on a file in the ListViewmFileListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView,View view,int position,long rowId) {...if (fileUri != null) {...// Put the Uri and MIME type in the result IntentmResultIntent.setDataAndType(fileUri,getContentResolver().getType(fileUri));// Set the resultMainActivity.this.setResult(Activity.RESULT_OK,mResultIntent);} else {mResultIntent.setDataAndType(null, "");MainActivity.this.setResult(RESULT_CANCELED,mResultIntent);}}});

一旦用户选择了文件,那么就应该立即带用户返回客户端APP。实现这种方式的一种方法就是提供一个钩形符号或者结束按钮。使用Button的android:onClick属性与对应的Button相关联。在方法中。调用finish()方法:

    public void onDoneClick(View v) {// Associate a method with the Done buttonfinish();}

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

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

相关文章

大众点评搜索基于知识图谱的深度学习排序实践

1. 引言 挑战与思路 搜索是大众点评App上用户进行信息查找的最大入口&#xff0c;是连接用户和信息的重要纽带。而用户搜索的方式和场景非常多样&#xff0c;并且由于对接业务种类多&#xff0c;流量差异大&#xff0c;为大众点评搜索&#xff08;下文简称点评搜索&#xff09;…

论文浅尝 \ 联合知识图谱实例和本体概念的通用表示学习

论文笔记整理&#xff1a;周虹廷&#xff0c;浙江大学研究生。研究方向&#xff1a;知识图谱&#xff0c;图表示学习等。论文链接&#xff1a;http://web.cs.ucla.edu/~yzsun/papers/2019_KDD_JOIE.pdf本文是发表在KDD 2019上的关于知识图谱表示学习的论文。现有知识图谱表示模…

手握顶会顶刊论文,自信满满面试算法岗竟被刷?

2020国内深度学习框架领域百花齐放。各大公司也都陆续推出了自己的框架&#xff0c;大大推动了深度学习的发展。深度学习俨然已经渗入到我们生活中的每个角落&#xff0c;给生活带来极大便利。深度学习能够针对生产生活所面临的复杂问题&#xff0c;给出高准确率、操作简易、成…

爬取热门网站的热榜,集中展示

爬取热门网站的热榜&#xff0c;集中展示&#xff1b;Integrate and display hot billboard or ranked topic from hot Chinese websites 抓取知乎热榜数据存入列表 #!/usr/bin/env python # encoding: utf-8__author__ HZTimport requests import re from bs4 import Beaut…

Android官方开发文档Training系列课程中文版:分享文件之请求一个共享文件

原文地址&#xff1a;http://android.xsoftlab.net/training/secure-file-sharing/request-file.html 当APP需要访问一个被其它APP所共享的文件时&#xff0c;这个APP通常需要发送一个请求给共享文件的那个APP(服务端)&#xff0c;在大多数的情况下&#xff0c;这个请求会启动…

LeetCode 110. 平衡二叉树(二叉树高度)

1. 题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7]3/ \9 20/ \15 7 返回 true 。…

人物志 | 美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年

洪磊&#xff0c;2013年加入美团&#xff0c;目前是美团外卖事业部终端组的负责人&#xff0c;也是美团技术委员会前端通道主席。在加入美团之前&#xff0c;洪磊的职业生涯可以用“跌宕起伏”来形容。他就读于中南财经政法大学&#xff0c;曾任职于雅虎中国&#xff0c;先后担…

论文浅尝 | 可建模语义分层的知识图谱补全方法

本文转载自公众号&#xff1a;PaperWeekly。论文作者&#xff1a;蔡健宇&#xff0c;中国科学技术大学&#xff0c;研究方向&#xff1a;知识图谱近些年&#xff0c;知识图谱&#xff08;Knowledge Graph&#xff09;在自然语言处理、问答系统、推荐系统等诸多领域取得了广泛且…

美团背后的商业模式是什么?后疫情时代该走向何方?

文 | King James知乎本文已获作者授权&#xff0c;禁止二次转载2020年的疫情&#xff0c;让10年前的一部剧再次进入人们的视线中&#xff0c;那就是《我的团长我的团》传统社区团购和各大互联网巨头都广发英雄帖招聘社区团购的团长&#xff0c;感觉回到了10年前那场“百团大战”…

Android官方开发文档Training系列课程中文版:分享文件之获取文件信息

原文地址&#xff1a;http://android.xsoftlab.net/training/secure-file-sharing/retrieve-info.html 之前的课程讲述了客户端APP试图与含有文件的URI一同运行&#xff0c;APP可以请求服务端APP的文件信息&#xff0c;包括文件的数据类型以及文件的大小。这些数据类型可以帮助…

LeetCode 783. 二叉搜索树结点最小距离(中序遍历)

1. 题目 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。 示例&#xff1a;输入: root [4,2,6,1,3,null,null] 输出: 1 解释: 注意&#xff0c;root是树结点对象(TreeNode object)&#xff0c;而不是数组。给定的树 [4,2,6,1,3,null,null] 可表示为下图…

Kubernetes 1.20 版本开始将弃用 Docker,是时候拥抱 Containerd 和 Podman 了!

Kubelet 中对 Docker 支持被弃用&#xff0c;并将在以后的版本中删除。Kubelet 使用一个名为 dockershim 的模块&#xff0c;该模块实现了对Docker的 CRI 支持&#xff0c;在此PR后续版本将删除dockershim。 Kubectl 弃用 --delete-local-data 参数。 名词解释 上面中提到两个名…

开源开放 | OpenKG 更新发布新冠概念、防控和流行病等多个知识图谱

近日&#xff0c;OpenKG 继续更新发布多个新冠知识图谱&#xff0c;其中包括哈尔滨工业大学构建的新冠概念图谱&#xff0c;武汉科技大学与东南大学联合构建的新冠防控图谱。同时&#xff0c;更新了由 IBM 中国研究院构建的流行病学图谱 V1.1。OpenKG 发布的所有新冠知识图谱都…

客户端单周发版下的多分支自动化管理与实践

背景 目前&#xff0c;互联网产品呈现出高频优化迭代的趋势&#xff0c;需求方希望尽早地看到结果&#xff0c;并给予及时反馈&#xff0c;所以技术团队需要用“小步快跑”的姿势来做产品&#xff0c;尽早地交付新版本。基于以上背景&#xff0c;美团客户端研发平台适时地推行了…

无意中发现了一位清华大佬的代码模版

对于刷题相关的文章&#xff0c;在之前我也推荐过不少&#xff0c;今天在给大家推荐一份算法刷题笔记&#xff0c;这份笔记与以往的刷题有所区别&#xff0c;作者把 Leetcode 一千多道题都进行了系统的整理&#xff0c;并且对于每一道题的代码&#xff0c;都要求 beat 100%。作…

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

原文地址&#xff1a;http://android.xsoftlab.net/training/beam-files/index.html 导言 Android允许你通过Android Beam文件传输特性在两台设备之间传送大文件。这个特性拥有一个简单的API&#xff0c;允许用户通过简单的设备接触来启动一个传输进程。在响应端&#xff0c;…

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;相信技术指标在交易实践毫…