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

时间:2017-03-27 01:26:50

标签: android permissions share

使用Nexus 5,os M 6.0.1,并在相机应用中选择一张照片并进行“分享”。在目标应用程序中,它从intent和filePath获取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 个答案:

答案 0 :(得分:2)

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

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

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

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

很容易通过uri,但下一个应用程序不会是abls从它读取,因为你无法传输获得的权限。

您可以做的是使用内容提供商来提供所选文件。

答案 1 :(得分:0)

如果您需要&#34;在未经“存储”许可的情况下阅读该文件&#34;。你需要下来targetSdkVersion。您可以编辑build.gradle文件容器&#34; applicationId&#34;,使用&#34; targetSdkVersion 22&#34;在标签&#34; defaultConfig&#34;。