Итак, я пытался создать свой собственный файловый браузер через это руководство
И каждый раз, когда я запускаю приложение, оно вылетает. Мой журнал говорит следующее:
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)
Может ли кто-нибудь помочь мне решить эту проблему?
Обычно процесс заключается в следующем: скопируйте ошибку, вставьте ее в Google, откройте вопрос SO, посмотрите свой код, затем ответ, найдите разницу, исправьте ее.
это NPE, поэтому первым шагом будет проверка ваших объектов, массивов или списков, если они инициализированы или нет.
File[] files = f.listFiles();. После этого добавьте if (files==null) return;.
да, разрешения предоставлены в моем манифесте
Нет. Не предоставлено. Запрошено. Но для Android 6+ этого недостаточно. См. Первый комментарий.
о, спасибо, что сработало! Но теперь он не отображает мои папки, почему?
Вероятно, объяснено в предыдущих комментариях. Тест null заставляет приложение не разбиться с NPE, когда ОС не позволяет приложению видеть файлы пользователя (из-за проблемы с разрешениями приложения ...)




Попробуйте этот код и измените этот метод 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"
это локальная переменная private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 1;
отсутствует аргумент также в методе onRequestPermissionsResult при вызове getDir (..)
Я упоминаю комментарий, пройдите свой путь.
Sry, я пытался часами ... теперь это в значительной степени работает благодаря вашей помощи !! : D Но если я хочу открыть файл, как бы это было возможно, когда я нажимаю на PDF-файл, ничего не происходит. Например, мне нужно открыть xmls для своего приложения
Вы добавили разрешение времени выполнения для чтения внешнего хранилища?