Невозможно создать каталог во внешнем хранилище, даже если права доступа - PullRequest
2 голосов
/ 22 января 2020

У меня проблемы с созданием нового каталога на внешнем хранилище в android studio. Возможно, придется что-то делать с разрешениями, но, насколько я знаю, все кажется хорошим.

Что я хочу сделать, это:

  1. Проверить, если каталог "/ storage / emulated / 0 / Recordings "существует, если нет - создайте каталог
  2. Проверьте, существует ли файл" /storage/emulated/0/Recordings/tempFile.raw ", если существует - удалите его
  3. Создайте файл внутри каталога, используя «новый FileOutputStream (имя файла);»

Код, использующий (упрощенно):

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"/>

Разрешения:

https://stackoverflow.com/image.jpg

Внешнее хранилище на виртуальном устройстве:

https://stackoverflow.com/image.jpg

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'
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вам необходимо добавить это в AndroidManifest. xml файл в теге приложения android:requestLegacyExternalStorage="true", если вы запускаете приложение на Android 10.

Это временное решение. С Android 11 Объем хранения должны быть использованы.

2 голосов
/ 22 января 2020

Прежде всего вы пропускаете другое разрешение:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...