繁体   English   中英

Android - 尽管内联权限和清单权限,从存储中读取文件“Permission Denied”

[英]Android - Read file from storage “Permission Denied” despite inline permissions and manifest permissions

我似乎无法通过java.io.FileNotFoundException :( Permission Denied)错误,即使我认为我已经覆盖了所有的基础。 我正在使用意图uri,因此用户可以自己找到该文件。

我已经在清单中拥有必要的权限,并在运行时请求权限。

在我的清单中:

打开文件夹打开用户可以选择文件的意图

public void openFolder() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    getActivity().startActivityForResult(intent, 2);
}

然后在MainActivity.java中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    else if(requestCode==2 && resultCode==RESULT_OK){
        classificationFragment.givePath(data.getData(), this);
    }
}

我被拒绝试图打开文件

public void givePath(Uri data, Context context) {
    checkReadExternalStoragePermission();
    checkWriteExternalStoragePermission();
    try {
        BufferedReader reader = new BufferedReader(new FileReader(getPath(this.getContext(), data))); // ERROR HERE
        //do some stuf with the file
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这些应该在运行时检查权限

public void checkWriteExternalStoragePermission() {
    ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions((Activity) context,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
    }
}

public void checkReadExternalStoragePermission() {
    ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions((Activity) context,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                MY_PERMISSIONS_READ_EXTERNAL_STORAGE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    Log.d("REQUEST_CODE",String.valueOf(requestCode));
    switch (requestCode) {
        case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(context, "Write Storage Permission (already) Granted", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        case MY_PERMISSIONS_READ_EXTERNAL_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(context, "Write Storage Permission (already) Granted", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    }
}

我被困了一段时间。 任何输入都表示赞赏!

requestPermission不是阻塞方法。 这意味着,它会提示权限对话框,并在用户点击“确定”或“取消”之前立即返回。 所以这段代码:

try {
    BufferedReader reader = new BufferedReader(new FileReader(getPath(this.getContext(), data))); // ERROR HERE
    //do some stuf with the file
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

在授予所需权限之前调用。

解决方案是将这段代码移到后面

Toast.makeText(context, "Write Storage Permission (already) Granted", 
  Toast.LENGTH_SHORT).show();

我不知道为什么但Environment.getExternalStorageDirectory()允许我访问该文件

File Root = Environment.getExternalStorageDirectory();
String[] elements = data.getPath().toString().split("/");
BufferedReader reader = new BufferedReader(new FileReader(Root + "/FolderName/" + elements[elements.length-1]));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM