尝试从目录创建文件列表时,应用程序崩溃

时间:2019-06-30 16:28:21

标签: java android file

[我是新来的] 嗨,我正在尝试创建录音机应用。我已经弄清楚了如何录制音频和播放音频。现在,我只希望我的应用程序显示特定目录(例如,“ / Documents / MyApp”)中包含的所有文件的列表。这样我就可以看到我刚刚创建的文件。现在,我只是试图列出来自外部存储的任何文件。问题是,应用程序在启动时崩溃。当我删除有关读取外部存储设备的行时,它可以正常工作。

我在网上尝试了很多不同的方法,所有方法都非常相似。但是它们都会导致相同的结果:应用程序在启动时崩溃。这是代码:

library(data.table)

setDT(resp)

## add replicate number
resp[, id := seq_len(.N), by = c("dose", "ionidx")]
## cast to wide format
dcast(resp, ionidx ~ dose + id, value.var = "intensities")
#>    ionidx 0.0023_1 0.0023_2 0.0023_3 0.0023_4 0.0023_5 0.0023_6 0.0069_1
#> 1:      1    28703    31581    28301    31146    27926    32300    30039
#> 2:      2     6936     7008     8745     7600     7408     8263     7798
#>    0.0069_2 0.0069_3 0.0069_4 0.0069_5 0.0069_6 0.0206_1 0.0206_2 0.0206_3
#> 1:    31842    29414    30337    30812    31559    30384    29411    29947
#> 2:     8520     7903     8245     8530     8280     8174     7902     8922
#>    0.0206_4 0.0206_5 0.0206_6 0.0617_1 0.0617_2 0.0617_3 0.0617_4 0.0617_5
#> 1:    31297    30800    30774    31459    31830    29685    30555    30919
#> 2:     8517     9000     8845     8709     8332     9305     8908     7640
#>    0.0617_6 0.1852_1 0.1852_2 0.1852_3 0.1852_4 0.1852_5 0.1852_6 0.5556_1
#> 1:    32864    30292    32286    32139    31812    30365    32256    30144
#> 2:     8818     9970    10140     9605    10668     9685    10655    10580
#>    0.5556_2 0.5556_3 0.5556_4 0.5556_5 0.5556_6 1.6667_1 1.6667_2 1.6667_3
#> 1:    29720    29295    29191    30020    31127    32674    28931    31405
#> 2:    11031    10743     9760     8818    11396    10496     9832    10498
#>    1.6667_4 1.6667_5 1.6667_6   5_1   5_2   5_3   5_4   5_5   5_6
#> 1:    32290    31791    30491 28396 28933 31594 31110 28793 33500
#> 2:    11869    10325    11264 11328 11339 12282 12763 12223 13359

我希望该应用程序以“回收者”视图列出目录中包含的所有文件的名称。为此,我创建了一个名为“ mNames”的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之前,先获取文件的所有名称。但是该应用在启动时崩溃...

2 个答案:

答案 0 :(得分:0)

您的应用可能因无法完成 onCreate (必须完成per the Activity lifecycle)而崩溃,因为您没有请求查看存储的权限。

您需要在代码周围加上一个检查,以查看用户是否有权访问用户外部存储。您还需要处理用户未授予权限的情况。 here是更多文档。您的代码应修改为如下所示:

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();
    }
}

答案 1 :(得分:0)

像这样更改您的构造函数;

  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。我认为这是您的主要问题。希望这会有所帮助