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

Android 如何在不授予“存储”权限的情况下访问共享文件,android,permissions,share,Android,Permissions,Share,使用Nexus 5、os M 6.0.1和照相/摄像机应用程序,选择一张照片并进行“共享”。在目标应用程序中,它从intent和文件路径获取Uri。 当新建FileInputStreamnew FilepathToFile时抛出: 打开失败:EACCES权限被拒绝 这是因为未授予“存储”权限,但不希望要求用户专门授予“存储”权限。 是否有其他方法可以在没有“存储”权限的情况下读取文件 以下是提取文件路径的方式: if (Intent.ACTION_SEND.equals(action) &

使用Nexus 5、os M 6.0.1和照相/摄像机应用程序,选择一张照片并进行“共享”。在目标应用程序中,它从intent和文件路径获取Uri。 当新建FileInputStreamnew FilepathToFile时抛出: 打开失败: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)

如果您想在没有“存储”权限的情况下读取文件。您需要关闭targetSdkVersion。您可以编辑build.gradle文件容器applicationId,在标记defaultConfig上使用targetSdkVersion 22。

如果您想在没有“存储”权限的情况下读取文件。您需要关闭targetSdkVersion。您可以编辑build.gradle文件容器applicationId,在标记defaultConfig上使用targetSdkVersion 22。

不要从该uri提取文件路径

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

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

将uri传递到下一个应用程序将遇到足够多的问题

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


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

不要从该uri提取文件路径

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

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

将uri传递到下一个应用程序将遇到足够多的问题

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


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

您收到的实际uri是多少?您收到的实际uri是多少?谢谢您的建议。将尝试从不尝试从URI提取文件路径。而是直接打开uri的输入流。。顺便说一句,我没有创建uri来传递给下一个应用程序,这是从“相机”应用程序的库中进行共享,我的应用程序是“下一个”应用程序。谢谢你的建议。将尝试从不尝试从URI提取文件路径。而是直接打开uri的输入流。。顺便说一句,我没有创建uri来传递给下一个应用程序,它是从“相机”应用程序的库中进行共享,我的应用程序是“下一个”应用程序。