【问题标题】:File not found exception when reading external storage读取外部存储时找不到文件异常
【发布时间】:2016-07-11 11:26:27
【问题描述】:

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

显示未找到文件异常

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

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

【问题讨论】:

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


    【解决方案1】:

    由于您的代码在 Pre-Marshmallow 设备中运行良好,因此您似乎没有在应用中添加运行时权限。

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

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

    详细了解在运行时请求权限在 Android here

    【讨论】:

    • 嗨 Ashish,我已经请求了运行时权限,并且该部分工作正常,当我第一次启动应用程序时,它明确要求我提供写入权限。
    【解决方案2】:

    在你里面做这个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。如果是这样,那么它会在加载应用程序时向用户请求许可。

    希望对您有所帮助。经测试。工作正常。

    【讨论】:

    • 嗨 Gaurang,我已经实现了运行时权限部分,以获取写入外部存储的权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多