Android приложение cra sh при попытке записи файла - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть некоторые данные и записывают их в файл. Но мое приложение продолжает падать. Я пробовал так много вещей, но это не исправлено.

Вот мой код для этого.

private void logInValidator(String userName, SimpleCallback<Boolean> finishedCallback) {

        DatabaseReference rootRef = databaseManager.getReference();
        DatabaseReference usersRef = rootRef.child("user");
        Query queryUsernameFinder = usersRef.orderByKey().equalTo(userName);
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    user = ds.getValue(User.class);
                }
                String passHash = null;
                passHash = Objects.requireNonNull(user).getPasswordHash();

                try {
                    validated = PasswordHandler.validatePassword(password, Objects.requireNonNull(passHash));
                } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
                    e.printStackTrace();
                } finally {
                    finishedCallback.run(validated); // send the result to the callback
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                finishedCallback.run(false);
            }
        };
        queryUsernameFinder.addListenerForSingleValueEvent(valueEventListener);
    }

Этот код находит, существует ли имя пользователя в моей базе данных.

private void validateCredentials(){
        if (PermissionChecker.checkInternetPermission(this)) {
            if (!EmptyChecker.isEmpty(usernameTextInputLayout) && !EmptyChecker.isEmpty(passwordTextInputLayout)) {
                password = Objects.requireNonNull(passwordTextInputLayout.getEditText()).getText().toString();
                userName = Objects.requireNonNull(usernameTextInputLayout.getEditText()).getText().toString();
                logInValidator(userName, (success) -> {
                    if (success) {
                        String textToWrite = getTextToWrite();
                        writeToFile.write("UserData.txt",textToWrite);

                        //Intent mainIntent = new Intent(LogInActivity.this, MainActivity.class);
                        //startActivity(mainIntent);
                    } else {
                        showResult.setText(getString(userNotFound));
                    }
                });
            } else {
                showResult.setText(getString(string.emptyField));
            }
        } else
            PermissionChecker.requestInternetPermission(TestActivity.this,ContextGetter.getAppContext());
    }

Этот код проверяет, совпадают ли имя пользователя и пароли.

public class WriteToFile extends AppCompatActivity {

    public void write(String fileName, String textToWrite) {
        //Checking the availability state of the External Storage.
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            if (PermissionChecker.checkInternetPermission(ContextGetter.getAppContext())) { 
                File dir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
                dir.mkdir(); // When application come this line app crashes
                File file = new File(dir, fileName);
                FileOutputStream os;
                try {
                    os = new FileOutputStream(file);
                    os.write(textToWrite.getBytes());
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                PermissionChecker.requestFilePermission(WriteToFile.this,ContextGetter.getAppContext()); // Code for permission
            }
        } else {
            Toast.makeText(ContextGetter.getAppContext(), "Can't write to File", Toast.LENGTH_SHORT).show();
        }
    }
}

Этот код обрабатывает операции записи в файл. Я сделал отладку, чтобы решить проблему. Я нахожу, когда отладчик приходит в "dir.mkdir ()", строка приложения вылетает. Я думаю, что это может вызвать из-за проблемы syn c. Но я не смог найти или исправить это.

И это мой logcat.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.track.medicine, PID: 6098
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getExternalFilesDir(java.lang.String)' on a null object reference
        at android.content.ContextWrapper.getExternalFilesDir(ContextWrapper.java:249)
        at com.track.medicine.WriteToFile.write(WriteToFile.java:20)
        at com.track.medicine.TestActivity.lambda$validateCredentials$2$TestActivity(TestActivity.java:110)
        at com.track.medicine.-$$Lambda$TestActivity$RQ_IhdpryAE_sEsi6RtMvH3Py8Q.run(Unknown Source:4)
        at com.track.medicine.TestActivity$1.onDataChange(TestActivity.java:90)
        at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@19.2.1:179)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 Ответ

1 голос
/ 19 февраля 2020

publi c класс WriteToFile расширяет AppCompatActivity {

publi c void write

И затем вы вызываете writeToFile.write("UserData.txt",textToWrite);

It выглядит так, как будто вы создали экземпляр своей активности с new.

Это недопустимо для действий. Их нужно начинать с использованием намерения.

И в вашем расширенном классе активности не может быть опубликовано c членов, как вы делаете с public void write.

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