使用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)
答案 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;。