首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从外部应用程序接收单个文件是不可读的,但当多个应用程序接收到单个文件时,该文件是可读的。

从外部应用程序接收单个文件是不可读的,但当多个应用程序接收到单个文件时,该文件是可读的。
EN

Stack Overflow用户
提问于 2017-03-19 01:52:07
回答 1查看 1.3K关注 0票数 0

当从外部应用程序接收文件时,我遇到了问题。我一直在学习关于https://developer.android.com/training/sharing/receive.html的教程,它可以正常工作,直到我想要处理代码中的图像为止。

我遇到的问题是,如果我只选择一个文件并将其发送到我的应用程序,那么在将它从URI转换为文件对象之后,我无法读取它。但是,如果我发送两个或多个图像(之前选择的相同图像加上来自同一个目录的另一个图像),那么我实际上可以读取文件(所有文件)。为什么会这样呢?即使将文件设置为setReadable(true);,我也无法在以后读取它。

目标SDK是23,是的,我已经在API 23+所需的代码中实现了权限请求。所以这不会是问题所在。我需要能够读取接收到的文件,无论它是一个或多个列表。

附带说明:如果我从Google应用程序(一个或多个)发送了大量图片,我就永远无法读取该文件。从"ES文件资源管理器“应用程序发送的图像在代码中是可读的,但如果我只向我的应用程序发送一个文件,则无法读取。

下面是问题部分的代码片段:

代码语言:javascript
运行
AI代码解释
复制
// THIS PART WORKS. RECEIVING MULTIPLE FILES ARE READABLE IN THE CODE BELOW.
void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        addImagesToNewOrExistingContact(imageUris);
    }
}

// THIS PART DOES NOT WORK. I CAN NOT READ THE FILE IN THE CODE BELOW.
private void addImageToNewOrExistingContactDialog(Uri imageUri) {
    ArrayList imageUris = new ArrayList<>();
    imageUris.add(imageUri);
    addImagesToNewOrExistingContact(imageUris);
}

private void addImagesToNewOrExistingContact(final ArrayList<Uri> imageUris) {

    for (Uri uri : imageUris) {
        File f = new File(uri.getPath());
        f.setReadable(true);
        f.setWritable(true);

        boolean readd = f.canRead(); // FALSE, but why?
        boolean exec = f.canExecute(); // FALSE, but why?
    }
}

我用以下文件测试了这个文件:

从"ES文件资源管理器“中选择两个文件并将它们发送到我的应用程序: file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1452348875289.jpg file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1455733673513.jpg

两个canRead() = TRUE

从"ES文件资源管理器“中选择一个文件,并将其发送到我的应用程序:内容://media/external/images/media/33675

canRead() = FALSE

实际上,文件内容://media/外部/映像/media/33675和file:///storage/emulated/0/Pictures/Adobe%C2%AE%20Photoshop%C2%AE%20Touch/1455733673513.jpg是完全相同的文件。

从"Google“中选择两个文件并将它们发送到我的应用程序: content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A4541959b-3222-4ee0-b838-67049141b864%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1290260075 content://com.google.android.apps.photos.contentprovider/0/1/shared%3A%2Flocal%253A20e65034-795f-4300-9472-64a598afc4c1%2FV2xDV01jNWhWVDRCQXRMY202YTh3NFNES1N4M01R/REQUIRE_ORIGINAL/NONE/1096770166

两个canRead() = FALSE

谢谢你提前提供帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 04:13:49

在openInputStream()上使用getContentResolver(Uri)。不需要文件类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42885156

复制
相关文章
EasyUI+SpringMVC 单个/多个文件上传
function uplodad( $('#fromNameId').form({ url:'controllerurl', onSubmit: function(){ //uploda before something }, success:function(data){ //upload after something },error:function(date){ $.messager.alert(data.errormsg); } }); $('#fromNameId').submit(); );
用户5640963
2019/07/28
1.6K0
IL3001:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如,通过将项目中的 PublishSingleFile 属性设置为 true)时,为单文件捆绑包内嵌入的程序集调用 Assembly.GetFile(s) 方法将始终引发异常,因为这些方法与单文件不兼容。
呆呆
2022/02/26
5110
IL3000:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用嵌入在单文件捆绑包内的程序集的 Assembly.Location 属性将始终返回空字符串。
呆呆
2022/02/26
5320
controller下载单个文件
controller里调用下载方法:然后controller下载方法返回值设置为void即可DownloadFile.download(request, response, "培训班材料合集", new File(folderPathDto.getTodoDownloadZipPath()));下载方法代码import org.apache.commons.io.IOUtils;import javax.servlet.http.HttpServletRequest;import javax.servlet
在下是首席架构师
2022/08/18
7610
Linux对文件中的特殊字符进行替换(单个文件与多个文件替换)
https://stackoverflow.com/questions/5800035/how-to-replace-nul-in-vi
小徐
2019/08/05
6.4K0
Linux对文件中的特殊字符进行替换(单个文件与多个文件替换)
IL3002:当发布为单个文件时,避免调用
将应用发布为单个文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用使用 RequiresAssemblyFilesAttribute 属性注释的成员与单文件不兼容。 这些调用可能不兼容,因为使用此属性注释的成员要求程序集文件位于磁盘上,而嵌入单文件应用的程序集已加载到内存中。
呆呆
2022/02/26
4690
【汇总】flash单个文件上传
之前有朋友给我发送email,询问我是否有单个文件上传的源代码,因为当时写这个好像是在09年,所以放哪了一时也没找着。后来整理硬盘的时候,找到了源码,所以决定来个汇总(之前写过的关于flash+js上传文件的例子):
meteoric
2018/11/16
1.1K0
CMake入门实战——单个源文件
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。 CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
AI异构
2020/07/29
5640
Postman没有选择文件,但是后端还接收到的文件
Postman往后端传输文件,没有选择文件,但是后端还接收到的文件。但文件名为空,大小为0;
ha_lydms
2023/08/09
3370
Postman没有选择文件,但是后端还接收到的文件
Git/SourceTree·查看单个文件提交记录
在Git版本控制的时候,有时候只关心查看单个指定文件的历史改动,而不需要查看整个工程的历史改动: 这里演示一个图形化办法:SourceTree,找到指定文件,右键菜单,选中 “查看选中的修改日志”
陈满iOS
2018/10/11
18.9K0
Git/SourceTree·查看单个文件提交记录
git 撤销单个文件到某个提交
更多超全超赞git资料参见:https://blog.csdn.net/w605283073/article/details/90489475
明明如月学长
2021/08/27
2.2K0
从“冰柜”到“冰棍儿”,下载Github单个文件
Enhanced Github也支持一键拷贝单个文件的全部内容, 对.py, .js等代码类文件支持较好, 对.md类型的文件的就无法支持(无法在Github在线编辑的文件格式, 都无法支持)
zhaoolee
2019/03/12
7300
从“冰柜”到“冰棍儿”,下载Github单个文件
如何从 GitHub 上下载指定项目的单个文件或文件夹
Github 默认是不支持下载存储在仓库中的部分内容的,通常你需要使用某个项目就必须下载该项目的所有文件。但有时我们需要只下载某一个项目中的某个文件夹或文件的内容,
iMike
2019/07/15
11.2K0
如何从 GitHub 上下载指定项目的单个文件或文件夹
Git示例教程 - 撤销对单个文件的修改
最终命令: git checkout HEAD a.txt # 撤销对a.txt文件的修改 git restore --source=HEAD --staged --worktree a.txt # 也可以使用这个命令 情景模拟: 先使用下面的命令初始化一个测试用的Git仓库: # 初始化一个空的Git仓库 mkdir repo && cd repo git init # 将a.txt加入到版本控制中 echo A1 > a.txt git ad
KINGYT
2019/10/28
1.6K0
GitHub如何下载单个文件夹
Github中并不提供单个文件夹下载, 每当下载仓库中某个文件夹时,只能克隆整个仓库, 浪费硬盘空间不说,浪费时间不说,每次克隆仓库时候,看到这下下载速度简直…!
程序手艺人
2019/02/21
3.5K0
【分享】Petalinux编译多个源文件的Linux应用程序的Makefile
作者: 付汉杰 hankf@xilinx.com hankf@amd.com 测试环境: PetaLinux 2021.2
hankfu
2022/03/23
3.4K0
Tomcat8如何解决上传文件的可读权限问题
使用springmvc做了一个文件上传的功能,上传到nginx目录下的一个文件夹,但是通过目录访问的时候却报403的错误
一觉睡到小时候
2019/11/28
1.3K0
tomcat程序生成的日志文件不可读问题 - 运维总结
现象描述: 线上机器的程序文件(包括TOMCAT自身)使用APP账号作为属主运行,同时禁止了APP账号的BASH。登录系统使用了统一认证,这样每个人都有自己的账号登录系统。为了方便开发人员登录查看日志,日志文件的文件权限为"rw-r-r",同时也是系统默认的umask。这里简单说下umask权限码。在Linux系统下,新建目录的权限是777减去umask码值,新建文件的权限是666减去umaks码值,由于linux默认的umask是0022,所以一般新建目录和文件的默认权限分别是755和644。
洗尽了浮华
2019/11/13
2.1K0
修改host访问github_github下载单个文件
搜索进入https://ipaddress.com/website/github.com
全栈程序员站长
2022/11/07
1K0
修改host访问github_github下载单个文件
macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
一、使用流程     Windows下的程序运行崩溃时,往往可以利用pdb文件快速解析出程序崩溃的具体位置,甚至可以对应到源代码的具体行数。macOS下的symbolicatecrash也具备相应的功能。对应于Windows下的pdb文件,macOS下的crash文件解析需要用到dSYM文件。这个文件正常情况下可能不会生成,需要在XCode进行设置。当程序崩溃时,通过symbolicatecrash对crash文件和dSYM文件中的符号进行映射,即可将crash文件中的内存地址转换为可读的字符串。以前的博文
24K纯开源
2018/01/18
2.7K0
macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号

相似问题

文件是可读的,但未能包括在内。

16

MITMPROXY使输出对文件是可读的

11

如何从多个文件创建可读文件流

120

在scala中将多个对象序列化为单个(人类可读的)文件

10

单个.m文件中有多个函数,但仅接收到1个函数的答案

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档