Запись на внешнее хранилище больше не работает на нуге - PullRequest
0 голосов
/ 24 августа 2018

Я написал небольшое приложение, чтобы научиться писать и читать файлы.Это сработало, но теперь я больше не могу писать файлы ..

1.Я добавил в манифест:

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

2.In MainActivity

// permissions array:
final String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
// permission code for action multiple permission request:
private static final int ALL_PERMISSIONS = 101;

3.OnCreate (MainActivity):

// check multiple permissions:
    ActivityCompat.requestPermissions(this, permissions, ALL_PERMISSIONS);

4.onRequestPermissionsResult (@override MainActivity):

    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // for PERMISSION_CODE:
    switch (ALL_PERMISSIONS){
        case 101:
            // if grantResults is populated:
            if(grantResults.length > 0){
                // 1° permission check:
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    reportText.append("\n GPS permission granted");
                }
                else{ reportText.append("\n no GPS permissions"); }
                // 2° permission check. NOTE: write permission is such as READ permission?
                if(grantResults[1] == PackageManager.PERMISSION_GRANTED){
                    reportText.append("\n WRITE permission granted");
                }
                else{ reportText.append("\n no WRITE permissions"); }
                if(grantResults[2] == PackageManager.PERMISSION_GRANTED){
                    reportText.append("\n READ permission granted");
                }
                else{reportText.append("\n no READ permissions"); }
            }
    }
}

5.OnButtonClickSave ():

public void onButtonSave(View view){
    // get text from EditView
    String textToSave = inputText.getText().toString();
    dir.mkdir();
    // check if folder exists:
    if (!dir.exists()){
        // if not, create it:
        dir.mkdir();
    }
    try {
        // write to file:
        FileOutputStream fos = new FileOutputStream(file, true);
        fos.write(textToSave.getBytes());
        fos.close();
        // add files to explorer (update device explorer)
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(uri);
        sendBroadcast(intent);
        // send message to activity-layout:
        reportText.append("\n file saved" + file.toString());
    } catch (IOException e) {
        // else error
        e.printStackTrace();
        reportText.append("\n file not saved");
    }
}

Я также установил TextView (называемый отчет, как вы можете видеть в коде), который предоставляет все предоставленные разрешения, но я не могу сохранить файл.(ФАЙЛ НЕ НАЙДЕН).

Что с этим не так?(это приложение работало несколько дней назад) ..

РЕДАКТИРОВАТЬ:

Извините за это, я пропустил, чтобы дать вам пути к файлам (onCreate):

        // create dir, file and Uri:
    dir = new File (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filepath);
    file = new File(dir, fileName);
    uri = Uri.fromFile(file);

1 Ответ

0 голосов
/ 25 августа 2018

После некоторого теста я нашел способ исправить эту проблему. Я не совсем уверен в своих выводах, но это вполне логично.

Когда я пытался сохранить файл, я пытался создать относительную папку, и это способ сделать это (в каждом примере учебник или вспомогательный документ). И это сработало ...

(нет необходимости использовать «файловый провайдер», как предложено @ R7G) Из официального документа: «FileProvider - это специальный подкласс ContentProvider, который обеспечивает безопасный общий доступ к файлам , связанным с приложением» *

Во время некоторого теста я удалил папку Donwload во внутреннем хранилище моего устройства. После этого код начал выдавать ошибки.

ОШИБКА: Я пытался создать непосредственно подпапку (fileFolder) внутри папки, которая больше не была удалена (Donwload):

dir = new File (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filepath);
dir.mkdir();

РЕШЕНИЕ: В моем случае (подпапка внутри папки) вы должны обязательно создать каждую родительскую папку перед ее дочерней.

File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
dir.mkdir();
subDir = dir = new File (dir, filepath);
subDir.mkdir();

.... и т. Д. (Если есть другие подпапки)

Надеюсь, это поможет. Если бы кто-то смог подтвердить или расширить мой ответ, было бы здорово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...