Android: 列出目录下的所有文件

Android: List all file in a directory

我正在尝试构建一个列出目录中所有文件并允许用户点击文件并根据文件扩展名在特定应用程序中打开它的应用程序。到目前为止,我已经编写了这段代码来列出目录中的所有文件,但它似乎不起作用——它只会使应用程序崩溃。

有人能告诉我为什么吗?我试图复制我在 SO 和其他不同地方找到的其他代码片段,但 none 似乎有效。

提前致谢

String home = Environment.getExternalStorageDirectory().toString() + "/vuza/" + username;
Toast.makeText(this, "Debug: " + home, Toast.LENGTH_SHORT).show();

File root = new File(home);

File fileList[] = root.listFiles();

for(int x = 0; x < fileList.length; x++) {
    Toast.makeText(this, fileList[x].getName(), Toast.LENGTH_SHORT).show();
}

编辑:添加堆栈跟踪

04-08 19:29:39.230    5264-5264/com.mikekaperys.assignment E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.mikekaperys.assignment, PID: 5264
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mikekaperys.assignment/com.mikekaperys.assignment.Files}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access0(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.mikekaperys.assignment.Files.onCreate(Files.java:32)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access0(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

1) 将其放入清单中:

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

2) 还要检查 home 路径是否存在。

3) fileList.length 如果其中没有目录,可能 return 为 null。在 loop.

之前检查 fileList 是否为 null

用以下代码替换您的代码

String home = Environment.getExternalStorageDirectory().toString() + "/vuza/" + username;

文件文件=新文件(主页);

if(file.exists())
{
//method call
    listf(home);
}
else
{
Toast.makeText(this,"no dir extists"), Toast.LENGTH_SHORT).show();
}

public File[] listf(String directoryName) {

    // .............list file
    File directory = new File(directoryName);

    // get all the files from a directory
    File[] fList = directory.listFiles();

    for (File file : fList) {
        if (file.isFile()) {
            System.out.println(file.getAbsolutePath());
        } else if (file.isDirectory()) {
            listf(file.getAbsolutePath());
        }
    }
    System.out.println(fList);
    return fList;
} 

还要确保您已授予以下权限

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