SD卡上的重复文件

时间:2016-09-01 11:14:23

标签: java android file

我的应用程序使用

从图库中获取共享图像
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,但问题也来自其他用户

我缺少什么?

1 个答案:

答案 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

上被提及