-1

我正在尝试在 上的特定文件夹中显示 mp3 文件sdcard/myaudio,我找到了这个示例:

如何列出位于 sd 卡上的所有文件和文件夹

我在第一种方法中写了sdcard名称和文件夹,但是应用程序崩溃了

这就是我到目前为止所做的

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myList = new ArrayList<String>();

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File(root_sd + "/sdcard/myaudio");
    File list[] = file.listFiles();

    for (int i = 0; i < list.length; i++) {
        myList.add(list[i].getName());
    }

    setListAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myList));

}

请帮忙。

更新

public class MainActivity extends ListActivity {
private File file;
String root_sd = Environment.getExternalStorageDirectory().toString();
ArrayList<String> myList = new ArrayList<String>();

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    checkAndCreateDirectory();

    if (ActivityCompat.checkSelfPermission(this,
            android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        fillList();
    } else {
        ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
    }
}

private void fillList() {
    String root_sd = Environment.getExternalStorageDirectory().toString();
    File file = new File(root_sd + "/sdcard/myaudio");
    File list[] = file.listFiles();

    for (int i = 0; i < list.length; i++) {
        myList.add(list[i].getName());
    }

    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList));
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                fillList();
            }
        }
    }
}

private void checkAndCreateDirectory() {
}

public void checkAndCreateDirectory(String dirName){
    File new_dir = new File( root_sd + "/sdcard/myaudio/" );
    if( !new_dir.exists() ){
        new_dir.mkdirs();
    }
}

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    File temp_file = new File(file, myList.get(position));

    if (!temp_file.isFile()) {
        file = new File(file, myList.get(position));
        File list[] = file.listFiles();

        myList.clear();

        for (int i = 0; i < list.length; i++) {
            myList.add(list[i].getName());
        }
        Toast.makeText(getApplicationContext(), file.toString(), Toast.LENGTH_LONG).show();
        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, myList));
    }
}

@Override
public void onBackPressed() {
    String parent = file.getParent().toString();
    file = new File(parent);
    File list[] = file.listFiles();

    myList.clear();

    for (int i = 0; i < list.length; i++) {
        myList.add(list[i].getName());
    }
    Toast.makeText(getApplicationContext(), parent, Toast.LENGTH_LONG).show();
    setListAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myList));
}

}

4

2 回答 2

0

您的应用似乎没有读取外部存储的权限。
写这个:

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

就在您的 Put this 声明中的<application标记之前:manifest.xml

ArrayList<String> myList = new ArrayList<String>();

而不是onCreate()在班级级别(之前onCreate())的内部,以使其在您的活动班级的任何地方可见。
创建此方法:

private void fillList() {
    String root_sd = Environment.getExternalStorageDirectory().toString();
    File file = new File(root_sd + "/datanfile");
    File list[] = file.listFiles();

    for (int i = 0; i < list.length; i++) {
        myList.add(list[i].getName());
    }

    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList));       
}

并且onCreate()只有这个代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);  ???????
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        fillList();
    } else {
        ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
    }
}

这样,如果尚未授予,您的应用程序将请求必要的许可。
现在,您将通过覆盖获得用户是否授予此权限onRequestPermissionsResult()

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                fillList();
            }
        }
    }
}

在用户接受或不授予您的应用权限后调用上述方法。如果您的应用程序已经拥有权限,或者在用户授予权限后,
so将被执行。fillList()如果用户不授予权限,则不会执行。
编辑
onCreate()您发布的方法中没有setContentView(). 为什么?
Edit2
在您的代码中,您有:

private void checkAndCreateDirectory() {
}

public void checkAndCreateDirectory(String dirName){
    File new_dir = new File( root_sd + "/sdcard/myaudio/" );
    if( !new_dir.exists() ){
        new_dir.mkdirs();
    }
}

删除第一个并String dirName从第二个中删除

于 2018-12-02T15:31:00.063 回答
0

你的file.listFiles();可能是空的。由于空文件夹或特定文件夹不存在,可能会发生这种情况。

您可以使用以下方法检查文件夹是否已经存在,否则创建它。

 public void checkAndCreateDirectory(String dirName){
        File new_dir = new File( rootDir + dirName );
        if( !new_dir.exists() ){
             new_dir.mkdirs();
        }
    }

您可以通过添加以下空检查来避免文件夹为空时的崩溃

File list[] = file.listFiles(); 
if(list == null) return;
于 2018-12-02T12:11:26.120 回答