读取外部存储时发现文件未找到异常

时间:2016-07-11 11:26:28

标签: android android-6.0-marshmallow android-permissions

之前的代码工作正常,即使现在它适用于Android 6之前的设备,但在我的Nexus 5,6.0.1中,我无法从外部存储访问数据。

显示File not Found Exception

  

java.io.FileNotFoundException:/ storage / emulated / 0 / Download / ******** / *****:open failed:ENOENT(没有这样的文件或目录)

为了将数据写入存储,我要求运行时存储权限,那部分似乎没问题。

2 个答案:

答案 0 :(得分:1)

由于您的代码在Pre-Marshmallow设备中运行良好,看起来您还没有在应用中添加运行时权限。

Android M开始,您需要在运行时请求权限,如文档中所述:

  

从Android 6.0(API级别23)开始,用户在应用运行时向应用授予权限,而不是在安装应用时授予权限。

详细了解Android here

在运行时请求权限

答案 1 :(得分:1)

在主要活动的onCreate()方法中进行此操作:

if (currentapiVersion > android.os.Build.VERSION_CODES.LOLLIPOP){
    // Do something for lollipop and above versions
    checkPermission();
    if (!checkPermission()) {
        requestPermission();
    }
}

这段代码onCreate()

private boolean checkPermission(){
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION);
    if (result == PackageManager.PERMISSION_GRANTED){
        return true;
    } else {
        return false;
    }
}

private void requestPermission(){
    ActivityCompat.requestPermissions(activity,new String[]{
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CALL_PHONE},PERMISSION_REQUEST_CODE
    );
}

此代码将检查版本是否高于Lollipop OS。如果是这样,那么它将在加载应用时向用户请求许可。

希望它会对你有所帮助。测试。工作正常。