使用Java读取Android上文件夹中的所有文件时出错
我的应用程序在运行时崩溃。我在安卓5.1(棒棒糖)上试用过。此应用程序需要读取文件夹中的所有文件。该文件夹已下载到SD卡上 Listview工作正常,没有错误。资料来源是:使用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);
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运行时权限。可能存在问题。参考:错误是什么以及导致错误的代码行。