Приложение вылетает при попытке создать список файлов из каталога - PullRequest
0 голосов
/ 30 июня 2019

[Я новичок здесь] Привет, я пытаюсь создать приложение для записи голоса.Я уже разобрался, как записывать аудио и проигрывать аудио.Сейчас я просто хочу, чтобы мое приложение отображало список всех файлов, содержащихся в определенном каталоге (например, "/ Documents / MyApp").Так что я вижу файл, который я только что создал.Сейчас я просто пытаюсь перечислить любой файл, поступающий из внешнего хранилища.Проблема в том, что приложение запускается при запуске.Когда я удаляю строки о чтении внешнего хранилища, оно работает отлично.

Я перепробовал много разных методов в Интернете, все очень похожие.Но все они приводят к одному и тому же результату: приложение вылетает при запуске.Вот код:

public class FileAndDirectoryActivity extends AppCompatActivity {

    private ArrayList<String> mNames = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_and_directory);
        File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
        File[] arrayFiles = directory.listFiles();
        for (File file : arrayFiles){
            mNames.add(file.getName());
        }
        initRecyclerView();

    }
    private void initRecyclerView() {
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}

Я ожидаю, что приложение отобразит в представлении переработчика имена всех файлов, содержащихся в каталоге.Для этого я создал arrayList с именем "mNames", получающий все имена файлов перед отправкой на мой RecyclerViewAdapter.Но приложение вылетает при запуске ...

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Измените свой конструктор, как это;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file_and_directory);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
    File[] arrayFiles = directory.listFiles();
    for (File file : arrayFiles){
        mNames.add(file.getName());
    }
    mNames = arrayFiles== null
            ? new ArrayList<File>()
            : new ArrayList<File>(Arrays.asList(arrayFiles));

    initRecyclerView();

}

Я не уверен, что это решит вашу проблему.Потому что нам нужно сначала увидеть logcat.Если у вас есть права на просмотр файлов, вам нужно инициализировать свой ArrayList следующим образом.Я думаю, что это ваша главная проблема.Надеюсь, это поможет

0 голосов
/ 30 июня 2019

Ваше приложение, вероятно, аварийно завершает работу, поскольку оно не может завершить onCreate (которое ДОЛЖНО завершаться в течение жизненного цикла действия ), поскольку вы не запрашиваете разрешения для просмотра хранилища.

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

public class FileAndDirectoryActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST = 1000;
    private ArrayList<String> mNames = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_and_directory);
        //Check if we have the permission to read storage
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //We dont have the permission, so request it.
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST);
        }
        //We already have permission
        else{
            permissionExists();
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == PERMISSION_REQUEST){
            if(resultCode == RESULT_OK){
                permissionExists();
            }
            else{
                //handle error
            }
        }
    }

    private void initRecyclerView() {
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(mNames, this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    private void permissionExists(){
        File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
        File[] arrayFiles = directory.listFiles();
        for (File file : arrayFiles) {
            mNames.add(file.getName());
        }
        initRecyclerView();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...