当前位置: 首页 > 知识库问答 >
问题:

如何在不授予“存储”权限的情况下访问共享文件

竺翰海
2023-03-14

有了Nexus5,OSM6.0。1,然后在照相机应用程序中选择一张照片并进行“共享”。在目标应用程序中,它从intent和文件路径获取Uri。当新建FileInputStream(新文件(pathToFile))时,它抛出:打开失败:EACCES(权限被拒绝)

这是因为未授予“存储”权限,但不希望要求用户专门授予“存储”权限。是否有其他方法可以在没有“存储”权限的情况下读取文件?

文件路径是这样提取的:

if (Intent.ACTION_SEND.equals(action) &&  
    intent.hasExtra(Intent.EXTRA_STREAM)) {

Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

String filePath;

Cursor cursor = null;
final String column = "_data"; 
final String[] projection = { column };
try {
  cursor = context.getContentResolver().query(uri, projection, null, null,
                    null);
  if (cursor != null && cursor.moveToFirst()) {
       final int column_index = cursor.getColumnIndexOrThrow(column);
       filePath = cursor.getString(column_index);           
  }
} catch(Exception e){
  return getFilePathFromInputStream(context, uri);
}
finally {
            if (cursor != null)
                cursor.close();
}

// upto here got filePath =   
   /storage/emulated/0/DCIM/Camera/IMG_20170326_184502.jpg

boolean b = false;
try{
   File f2 = new File(filePath);
   b = f2.exists();
} catch(Exception e) {
   Log.e("+++ exception e:"+e.getMessage());
} catch(Error e) {
   Log.e("+++ error e:"+e.getMessage());
}

// unto here no exception, then

fileInputStream = new FileInputStream(new File(filePath));  //<=== here throws

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20170326_184502.jpg: open failed: EACCES (Permission denied)

共有2个答案

邢焕
2023-03-14

如果你想"读取文件未经许可'存储'"。你需要向下目标SdkVersion。您可以编辑build.gradle文件容器"Application ationId",在标签"defaultConfig"上使用"Target etSdkVersion 22"。

郎曜文
2023-03-14

不要从该uri中提取文件路径。

只需将uri传递给下一个应用程序

永远不要尝试从URI提取文件路径。而是直接打开uri的输入流。不是文件输入流。

你将有足够的麻烦传递uri到下一个应用程序。

传递uri很容易,但下一个应用程序将无法读取,因为您无法传输获得的权限。

您可以改为使用内容提供商为所选文件提供服务。

 类似资料:
  • 我想为android清单做一个权限这个权限是 我的问题是,在没有用户干预的情况下,如何做到这一点?

  • 我按照AWS文档尝试了最简单的案例。我创建了角色,分配给实例并重新启动实例。为了以交互方式测试访问,我登录到Windows实例并运行<code>aws s3api列表对象--bucket testbucket 下一个测试是创建.aws/credentials文件并添加配置文件以承担角色。我修改了角色(分配给实例),并添加了由帐户中的任何用户担任角色的权限。当我运行相同的命令<code>aws s3

  • Milena Nikolic在“Google Play的新功能”演讲中表示,这是Google推出android11的一部分,她说: 当我们继续改进应用程序包时,我们期望它成为2021的某个新应用程序的需求。 我在文档中看到的一切都表明,在Play Store中使用应用程序捆绑包的唯一方法是使用他们的Play应用程序签名服务,例如: 注册到应用程序播放应用程序签名。否则,无法将应用包上传到Play控

  • 我已经创建了Google存储桶,为桶中的音频文件执行Google语音到文本的转换。但这不起作用,因为bucket拒绝访问Google语音API。 错误消息:匿名调用方没有存储。对象。获取访问权限\u被拒绝 语音使用API密钥进行身份验证,存储使用服务帐户密钥进行身份验证。我已经授予访问bucket中服务帐户的权限。 是否可以对存储桶进行语音访问? 我也尝试过给服务号桶权限。但是它不起作用。

  • 问题内容: 我可以使用以下代码轻松地授予对一个IP的访问权限: 但是我需要允许整个子网192.168.1。*远程访问数据库。 我怎样才能做到这一点? 问题答案: 编辑:考虑在此页面上查看并认可Malvineous的答案。网络掩码是一种更为优雅的解决方案。 只需在IP地址中将百分号用作通配符即可。 从http://dev.mysql.com/doc/refman/5.1/en/grant.html

  • 我知道在谷歌云存储中,你可以使用签名的URL,这是有时间限制的(还是不做真正的授权)。但是我在Firebase存储文档中没有看到任何关于的内容。我在关于Firebase存储的文章中看到过它,但从未直接在Firebase的文档中看到过。 据我所知,没有办法对访问Firebase存储文件进行真正的用户授权。请告诉我我错了。