我的应用程序使用
从图库中获取共享图像Uri imageUri = (Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
我希望能够在原始文件的相同位置复制文件(新名称)。
当文件位于内部存储器中时,我能够执行此操作,如下所示:
String filePath = getRealPathFromURI(this, imageUri);
String filePathNew = filePath;
int index = filePathNew.lastIndexOf('.');
filePathNew = filePathNew.substring(0, index) + "_" + System.currentTimeMillis() + filePathNew.substring(index);
File fOrig = new File(filePath);
File f = new File(filePathNew);
try {
copy(fOrig,f);
return true;
} catch (IOException e) {
MyLogger.log(ShareActivity.this, MyLogger.ERROR, e + "|||" + MyLogger.getStackTrace(e));
e.printStackTrace();
}
public String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA};
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} catch (Exception ex) {
MyLogger.log(context, MyLogger.ERROR, "Error getting Real path from URI" + ex + "|||" + MyLogger.getStackTrace(ex));
ex.printStackTrace();
return "NaN";
} finally {
if (cursor != null) {
cursor.close();
}
}
}
当共享图像来自SD卡时。我得到一个例外
java.io.IOException: open failed: EACCES (Permission denied)
java.io.IOException: open failed: EACCES (Permission denied)
at java.io.File.createNewFile(File.java:942)
URI path from EXTRA_STREAM:
/external/images/media/37713
URI Real Path:
/storage/0709-9CE1/raz test/raz.jpg
AndroidManifest权限: READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE MANAGE_DOCUMENTS INTERNET
我正在使用android 6.0.1测试Galaxy S7,但问题也来自其他用户
我缺少什么?
答案 0 :(得分:0)
奇怪的是,您的代码不包含Android权限,并且您将使用android 6.x,基于您需要添加的错误,以便在保存文件之前获得在外部存储上写入的权限。 你需要添加这样的东西:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RESULT);}
else {
//your treatment
}
并且您要执行的任何操作都需要检查权限,这些操作在manifest.xml
上被提及