【问题标题】:Cannot create a directory inside external storage even though permissions are given即使授予权限,也无法在外部存储中创建目录
【发布时间】:2020-01-22 12:14:13
【问题描述】:

我在 android studio 的外部存储上创建新目录时遇到问题。它可能需要对权限做一些事情,但据我所知,一切似乎都很好。

我想做的是:

  1. 检查目录“/storage/emulated/0/Recordings”是否存在,如果不存在 - 创建目录
  2. 检查文件“/storage/emulated/0/Recordings/tempFile.raw”是否存在,如果存在 - 删除它
  3. 使用“new FileOutputStream(filename);”在目录中创建一个文件

代码即时使用(简化):

String filepath = Environment.getExternalStorageDirectory().getPath();
//returns "/storage/emulated/0"
File file = new File(filepath,"Recordings");

if(!file.exists()){
   file.mkdirs();
}else{
   Log.w(TAG, "Didn't work");
}

fileName= "Recording #" + recordingNumber; //int recordingNumber = 1
recordingNumber++;
absolutePath = file.getAbsolutePath() + "/" + fileName + "tempFile.raw";

try {
   os = new FileOutputStream(absolutePath);
} catch (FileNotFoundException e) {
   e.printStackTrace();
}

我得到的错误:

java.io.FileNotFoundException: /storage/emulated/0/Recordings/tempFile.raw (No such file or directory)

注意:logcat 中没有“不工作”,表示 file.mkdirs() 已执行。

清单权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

权限:

虚拟设备上的外部存储:

Build.gradle:

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.soundrecorder"
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    首先你错过了另一个权限:

    WRITE_EXTERNAL_STORAGE

    此外,您必须明确要求您的活动获得许可。检查此链接:

    https://developer.android.com/training/permissions/requesting

    if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
    
        // Permission is not granted
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
            // No explanation needed; request the permission
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    } else {
        // Permission has already been granted
    }
    

    【讨论】:

    • 天哪,该死的。就是这样。一定是真的累了,在添加权限时,不小心删除了那个,或者类似的东西,然后没有注意到它不存在。虽然吸取了教训 - 仔细检查所有内容,然后再次仔细检查。谢谢,伙计
    【解决方案2】:

    如果您在 Android 10 上运行应用程序,则需要将其添加到 AndroidManifest.xml 文件中的应用程序标记 android:requestLegacyExternalStorage="true"

    这是一个临时解决方案。从 Android 11 开始必须使用 Scoped Storage

    【讨论】:

    • 不是这样,但感谢分享。干杯
    • 不客气。仅供参考,如果没有此标志,您的应用程序将在装有 OS Android 10 的设备上崩溃。另请阅读此developer.android.com/training/data-storage#scoped-storage
    • 谢谢,这让我发疯了 - 能够从三星和华为外部存储读取,但不能从 Google Pixel (Android 10) 读取 - 这解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2020-12-03
    • 2021-10-31
    • 1970-01-01
    • 2021-08-17
    • 2020-01-04
    • 2015-01-04
    相关资源
    最近更新 更多