当前位置: 首页 > 知识库问答 >
问题:

即使已授予权限,也无法在外部存储中创建目录

云弘壮
2023-03-14

我有问题在Android Studio中创建外部存储的新目录。它可能必须做一些有权限的事情,但据我所知,一切似乎都很好。

我想做的是:

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

代码im使用(简化):

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.FileNotFoundExc0019: /storage/emulated/0/Recordings/tempFile.raw(没有这样的文件或目录)

注意: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'
        }
    }
}

共有1个答案

叶允晨
2023-03-14

首先,你错过了另一个许可:

写入外部存储器

此外,在你的活动中,你必须明确请求许可。检查此链接:

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
}
 类似资料:
  • 我有一个针对SDK28的Android应用程序,所以我有处理的权限。我检查是否设置了,但当Exoplayer尝试读取文件(我验证该文件确实存在)时,我看到 com.google.android.exoplayer2.upstream.filedatasource$filedatasourceException:java.io.fileNotfoundexception:/storage/emula

  • 我分配一个角色权限来创建数据库。相同的角色被分配给登录用户,但是当我试图使用分配角色的登录用户创建新数据库时,我得到权限拒绝错误。 无法执行语句。权限拒绝,数据库主,所有者dbo。运行此命令需要以下权限:CREATE DATABASE。赛贝斯错误代码=10331严重级别=14,状态=3,事务状态=0第1行 我用15.5分和16分试了一下。我做错什么了吗?我们需要考虑其他参数吗?我经历了这次讨论 h

  • 我在*上运行命令< code >授予所有权限。*到由“root”标识的“root”@“%”; 并且它不断显示以下错误 11: 43:51向“root”标识的“root“@”%“授予所有权限。错误代码:1045。拒绝用户“root‘@”%的访问(使用密码:YES)0.00045秒 我还检查了Mysql上的User表,如下所示。 我不知道这是怎么回事?: 不重新安装MySQL怎么解决这个问题?(因为,

  • 我正在尝试创建一个目录和文件,以便可以存储从Internet下载的文件。但是,我无法在外部公共存储中创建目录和文件。如果我写入外部私有存储(应用程序的特定存储位置),我完全可以这样做。 代码如下: 上面的代码导致: 09-13 05:33:45.258 5867-5867/? I/S。出来﹕ /存储/0CED-0F09/图片 09-13 05:33:45.260 5867-5867/? I/S。出

  • 我的清单里有这个: 这是我尝试创建和写入文件的地方(它在一个名为的文件中): 当我尝试创建文件时,会显示以下内容: 如您所见,它在此处打印,表示授予了权限,但紧接着出现了“权限被拒绝”错误。有没有办法解决这个问题? 编辑:在旁注上,当它说它试图保存到数据/用户/0/cs时。cscb07courseproject/files,是在项目中还是保存在我的计算机上?因为当我去我的终端做cd/data或cd