Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java读取Android上文件夹中的所有文件时出错_Java_Android_File_Directory - Fatal编程技术网

使用Java读取Android上文件夹中的所有文件时出错

使用Java读取Android上文件夹中的所有文件时出错,java,android,file,directory,Java,Android,File,Directory,我的应用程序在运行时崩溃。我在安卓5.1(棒棒糖)上试用过。此应用程序需要读取文件夹中的所有文件。该文件夹已下载到SD卡上 Listview工作正常,没有错误。资料来源是: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我的应用程序在运行时崩溃。我在安卓5.1(棒棒糖)上试用过。此应用程序需要读取文件夹中的所有文件。该文件夹已下载到SD卡上

Listview工作正常,没有错误。资料来源是:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] files = getAllFilesInFolder(Environment.getExternalStorageDirectory().toString() + "/download");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.LargeTextInList, files);
        ListView list = (ListView) findViewById(R.id.listView);
        list.setAdapter(adapter);

        list.setOnItemClickListener(new ItemList());
    }

    String[] getAllFilesInFolder(String path){
        ArrayList<String> result = new ArrayList<String>(); //ArrayList cause you don't know how many files there is
        File folder = new File(path); //This is just to cast to a File type since you pass it as a String
        File[] filesInFolder = folder.listFiles(); // This returns all the folders and files in your path
        for (File file : filesInFolder) { //For each of the entries do:
            if (!file.isDirectory()) { //check that it's not a dir
                result.add(new String(file.getName())); //push the filename as a string
            }
        }

        String[] files = new String[ result.size() ];
        result.toArray( files );
        return files;
    }

    class ItemList implements AdapterView.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            ViewGroup vg = (ViewGroup) view;
            TextView tv = (TextView) vg.findViewById(R.id.LargeTextInList);
            Toast.makeText(MainActivity.this, tv.getText().toString(), Toast.LENGTH_SHORT).show();
        }
    }

}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[]files=GetAllFileInfolder(Environment.getExternalStorageDirectory().toString()+“/download”);
ArrayAdapter=新的ArrayAdapter(此,R.layout.list_项,R.id.largetExister,文件);
ListView列表=(ListView)findViewById(R.id.ListView);
list.setAdapter(适配器);
setOnItemClickListener(newitemlist());
}
String[]GetAllFileInfolder(字符串路径){
ArrayList result=new ArrayList();//ArrayList因为您不知道有多少文件
File folder=new File(path);//这只是强制转换为文件类型,因为它是作为字符串传递的
File[]fileinfolder=folder.listFiles();//返回路径中的所有文件夹和文件
对于(File:fileinfolder){//对于每个条目,请执行以下操作:
如果(!file.isDirectory()){//请检查它是否不是目录
result.add(新字符串(file.getName());//将文件名作为字符串推送
}
}
String[]files=新字符串[result.size()];
结果.toArray(文件);
归还文件;
}
类ItemList实现AdapterView.OnItemClickListener{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
ViewGroup vg=(ViewGroup)视图;
TextView tv=(TextView)vg.findviewbyd(R.id.largetexist);
Toast.makeText(MainActivity.this,tv.getText().toString(),Toast.LENGTH_SHORT).show();
}
}
}

您需要添加权限 1) 在您的AndroidManifest中添加

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.myApp">   

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

...
2) 然后在您的活动中,从api 21请求权限+

private static final int PERMISSIONS_READ_STORE = 2;

private void requestPermissions() {
    String [] permissions=new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String permission:permissions) {
        if (ContextCompat.checkSelfPermission(this,permission )!= PackageManager.PERMISSION_GRANTED){
            listPermissionsNeeded.add(permission);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSIONS_READ_STORE);
    }
}

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

    if(requestCode == PERMISSIONS_READ_STORE) {
        if (grantResults.length > 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          // Permissions ok get the files
        }
    }else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
private static final int PERMISSIONS\u READ\u STORE=2;
私有void requestPermissions(){
字符串[]权限=新字符串[]{
Manifest.permission.READ\u外部存储
};
List ListPermissionsNeed=new ArrayList();
用于(字符串权限:权限){
if(ContextCompat.checkSelfPermission(this,permission)!=PackageManager.permission\u已授予){
ListPermissionsNeed.add(权限);
}
}
如果(!ListPermissionsNeed.isEmpty()){
ActivityCompat.requestPermissions(此,ListPermissionsNeed.toArray(新字符串[ListPermissionsNeed.size())、权限\读取\存储);
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
if(requestCode==权限\读取\存储){
如果(grantResults.length>1&&grantResults[0]==已授予PackageManager.PERMISSION){
//权限确定获取文件
}
}否则{
super.onRequestPermissionsResult(请求代码、权限、授权结果);
}

在获取文件之前调用requestPermissions()

错误是什么?发布崩溃日志。是否在android清单中定义存储权限?对于android>5,应检查android运行时权限。可能存在问题。参考:错误是什么以及导致错误的代码行。