Сбой приложения при запросе разрешения / Android Studio

В настоящее время я работаю над Android-приложением для записи .txt в хранилище. Но каждый раз, когда я хочу запросить разрешения (во время выполнения), приложение вылетает с кодом ошибки: «Ошибка приложения остановлена ​​...».

Разрешение определяется в манифесте, и я проверяю, предоставлено ли оно уже. Но когда он попросит об этом, приложение немедленно вылетает.

Надеюсь, кто-нибудь сможет мне помочь.

Вот мой код:

public class MainActivity extends AppCompatActivity {
    //Deklarationen
    Button btn;
    EditText editText;

    //Ordner anlegen
    File ordner;

    //Mit beliebiger Zahl
    final int REQ_CODE_EXTERNAL_STORAGE_PERMISSION = 22;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Zuweisungen Speicherort
        //ordner = new File(Environment.getExternalStorageDirectory(), "SD_Konfiguration");

        //Ordner erstellen wenn noch nicht da
        if (!ordner.exists())
        {
            //ordner.mkdirs(); //Abfragen ob bereits Permission
            if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
            {
                createFolder();
            }
            else
            {
                //Dialog über Permission anzeigen
                ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE_EXTERNAL_STORAGE_PERMISSION);
            }

        }
        else
        {
            Toast.makeText(getApplicationContext(), "Ordner bereits angelegt", Toast.LENGTH_SHORT).show();
        }

        //Listener
        editText = (EditText)findViewById(R.id.editText);
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener()
        {
            //Aktiviert beim klicken
            @Override
            public void onClick(View v)
            {
                if (editText.getText().length() >0)
                {
                    //Datei anlegen
                    File Konfig = new File(ordner, "Konfig_Datei.txt");
                    Toast.makeText(getApplicationContext(), "Datei angelegt", Toast.LENGTH_SHORT).show();

                    //Schreiben
                    try
                    {
                        OutputStream outputStream = new FileOutputStream(Konfig);
                        outputStream.write(editText.getText().toString().getBytes());
                        outputStream.close();

                        //Wieder zurücksetzen
                        editText.setText(null);
                        Toast.makeText(getApplicationContext(), "Ergebnis gespeichert", Toast.LENGTH_SHORT).show();

                    }
                    catch (FileNotFoundException e)
                    {
                        e.printStackTrace();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }

                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Kein Text", Toast.LENGTH_SHORT).show();
                }
            }
        });


    }

    //Ordner mit Permission anlegen
    private void createFolder()
    {
        File ordner = new File(Environment.getExternalStorageDirectory(), "SD_Konfiguration");
        ordner.mkdirs();
        Toast.makeText(getApplicationContext(), "Ordner angelegt", Toast.LENGTH_SHORT).show();
    }

    //Hier wird übergeben ob Permission bestätigt wurde (läuf alles zusammen)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQ_CODE_EXTERNAL_STORAGE_PERMISSION && grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            createFolder();
        }
    }
}

Logcat:

04-05 11:22:44.959 4986-4986/? D/AndroidRuntime: Shutting down VM
04-05 11:22:44.959 4986-4986/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.sidacon.sidaconsd, PID: 4986
java.lang.RuntimeException: Unable to start activity ComponentInfo{de.sidacon.sidaconsd/de.sidacon.sidaconsd.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.exists()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.exists()' on a null object reference
    at de.sidacon.sidaconsd.MainActivity.onCreate(MainActivity.java:44)
    at android.app.Activity.performCreate(Activity.java:6237)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Разместите свой логарифм, пожалуйста.

Reaz Murshed 05.04.2018 13:14

Поставьте нулевую отметку для File ordner;

Danger 05.04.2018 13:18

Также logcat является обязательным для вопросов об ошибках. Как мы без него разберемся в проблеме?

Danger 05.04.2018 13:19

Извините, я новичок в Android и почти новичок в Java. Я добавил его в главный пост, спасибо за помощь.

NetflixAndChill 05.04.2018 13:29

Ваш ордер - нулевой человек

Danger 05.04.2018 13:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 593
2

Ответы 2

Хорошо, первое, что вы делаете, это спрашиваете разрешения, не проверяйте существование вашего Файла, чтобы запросить разрешение.

if (!ordner.exists()) //Do that later. 

И если пользователь отказывает в разрешении goBack / closeTheActivity

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQ_CODE_EXTERNAL_STORAGE_PERMISSION && grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
    {
        createFolder();
    }else{
        finish();
    }
}

Вы проверяете, существует ли файл или нет, прежде чем разрешение на хранение сначала даст разрешение, а затем проверьте, существует ли файл, как показано ниже.

        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
        {
            createFolder();
        }
        else
        {
            //Dialog über Permission anzeigen
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE_EXTERNAL_STORAGE_PERMISSION);
        }

    }

и измените свой createFolder () следующим образом

private void createFolder()
{
    File ordner = new File(Environment.getExternalStorageDirectory(), "SD_Konfiguration");
     if (!ordner.exists()){
    ordner.mkdirs();
    Toast.makeText(getApplicationContext(), "Ordner angelegt", Toast.LENGTH_SHORT).show();
    }
}

Другие вопросы по теме