Как получить разрешение на запись файлов в SDCard в Android 6.0+ - PullRequest
0 голосов
/ 24 сентября 2019

Я разрабатываю простой файловый менеджер для просмотра и записи файлов.Он отлично работает на внутренней памяти, но не на внешней SD-карте (доступ запрещен для записи файлов).У меня есть эти разрешения в файле AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

, и я запрашиваю их при запуске приложения.Но я все еще не могу сохранить файлы на внешнем SD.Когда я пытаюсь записать, используя FileOutputStream, он выдает FileNotFoundException, используя путь /storage/(sdcard folder)/:

java.io.FileNotFoundException: /storage/27BB-C7D9/Download/353874.jpg: open failed: EACCES (Permission denied)

. SD-карта только для чтения на Android?Некоторые приложения, такие как ES File Explorer, могут записывать файлы на внешние SD.Есть ли какая-то функциональность, которую я могу использовать для получения достаточных разрешений?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

Попробуйте этот код:

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");
FileOutputStream f = new FileOutputStream(file);
0 голосов
/ 24 сентября 2019

Выше 23 уровня API вы должны запросить его во время выполнения

String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, WRITE_REQUEST_CODE);

Теперь переопределите метод onRequestPermissionsResult, например,

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // write here
            } else {
                 // show message to user that permission needed
            }
        ....
    }
} 
0 голосов
/ 24 сентября 2019

Вам нужно использовать documentFile.

См. Мой ответ на старый вопрос о SD-картах, чтобы понять, как получить доступ к вашей SD-карте здесь .

...