Файловый менеджер не запускается

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

И каждый раз, когда я запускаю приложение, оно вылетает. Мой журнал говорит следующее:

05-08 09:31:46.520 23657-23657/com.example.mrwhite.fileexplorer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mrwhite.fileexplorer, PID: 23657
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mrwhite.fileexplorer/com.example.mrwhite.fileexplorer.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2804)

Может ли кто-нибудь помочь мне решить эту проблему?

Вы добавили разрешение времени выполнения для чтения внешнего хранилища?

Manohar 08.05.2018 09:42

Обычно процесс заключается в следующем: скопируйте ошибку, вставьте ее в Google, откройте вопрос SO, посмотрите свой код, затем ответ, найдите разницу, исправьте ее.

user9025311 08.05.2018 09:43

это NPE, поэтому первым шагом будет проверка ваших объектов, массивов или списков, если они инициализированы или нет.

himel 08.05.2018 09:45
File[] files = f.listFiles();. После этого добавьте if (files==null) return;.
greenapps 08.05.2018 09:48

да, разрешения предоставлены в моем манифесте

engin 08.05.2018 09:49

Нет. Не предоставлено. Запрошено. Но для Android 6+ этого недостаточно. См. Первый комментарий.

greenapps 08.05.2018 09:50

о, спасибо, что сработало! Но теперь он не отображает мои папки, почему?

engin 08.05.2018 09:57

Вероятно, объяснено в предыдущих комментариях. Тест null заставляет приложение не разбиться с NPE, когда ОС не позволяет приложению видеть файлы пользователя (из-за проблемы с разрешениями приложения ...)

Stephen C 08.05.2018 09:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот код и измените этот метод Get Dire ..

   private void getDir(String dirPath)
{
    myPath.setText("Location: " + dirPath);
    item = new ArrayList<String>();
    path = new ArrayList<String>();
    File f = new File(dirPath);
    File[] files = f.listFiles();

    if (!dirPath.equals(root))
    {
        item.add(root);
        path.add(root);
        item.add("../");
        path.add(f.getParent());
    }
    if (files.length!=0) {
        for (int i = 0; i < files.length; i++) {
            File file = files[i];

            if (!file.isHidden() && file.canRead()) {
                path.add(file.getPath());
                if (file.isDirectory()) {
                    item.add(file.getName() + "/");
                } else {
                    item.add(file.getName());
                }
            }
        }
    }
    ArrayAdapter<String> fileList =
            new ArrayAdapter<String>(this, R.layout.row, item);
    setListAdapter(fileList);
}
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myPath = (TextView)findViewById(R.id.path);

    root = Environment.getExternalStorageDirectory().getPath();
    if (!checkPermissions()) {
        requestPermissions();
    } else {


        getDir(root);
    }

}
/**
 * this method request to permission asked.
 */

private void requestPermissions() {
    boolean shouldProvideRationale =
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE);

    if (shouldProvideRationale) {
    } else {
        Log.i("Error", "Requesting permission");
        // previously and checked "Never ask again".
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }
}
private void getDir(String dirPath)
{
    myPath.setText("Location: " + dirPath);
    item = new ArrayList<String>();
    path = new ArrayList<String>();
    File f = new File(dirPath);
    File[] files = f.listFiles();

    if (!dirPath.equals(root))
    {
        item.add(root);
        path.add(root);
        item.add("../");
        path.add(f.getParent());
    }
    if (files.length!=0) {
        for (int i = 0; i < files.length; i++) {
            File file = files[i];

            if (!file.isHidden() && file.canRead()) {
                path.add(file.getPath());
                if (file.isDirectory()) {
                    item.add(file.getName() + "/");
                } else {
                    item.add(file.getName());
                }
            }
        }
    }
    ArrayAdapter<String> fileList =
            new ArrayAdapter<String>(this, R.layout.row, item);
    setListAdapter(fileList);
}
/**
 * this method check permission and return current state of permission need.
 */
private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
        if (grantResults.length <= 0) {
            // If user interaction was interrupted, the permission request is cancelled and you
            // receive empty arrays.
            Log.i("Error", "User interaction was cancelled.");
        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission was granted. Kick off the process of building and connecting
            // GoogleApiClient.
            getDir();//define path
        } else {
        }
    }

}

и я надеюсь, что вы добавите разрешение ниже в файл манифеста Android ..

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

и я делаю два метода для проверки разрешения runttime в моем коде.

теперь у меня есть символ разрешения connot "REQUEST_PERMISSIONS_REQUEST_CODE"

engin 08.05.2018 10:16

это локальная переменная private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 1;

Android Team 08.05.2018 10:28

отсутствует аргумент также в методе onRequestPermissionsResult при вызове getDir (..)

engin 08.05.2018 10:35

Я упоминаю комментарий, пройдите свой путь.

Android Team 08.05.2018 10:36

Sry, я пытался часами ... теперь это в значительной степени работает благодаря вашей помощи !! : D Но если я хочу открыть файл, как бы это было возможно, когда я нажимаю на PDF-файл, ничего не происходит. Например, мне нужно открыть xmls для своего приложения

engin 08.05.2018 10:40

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