我的应用程序中需要一个文件选择器,在尝试了不起作用的第三方库(无内容)后,我尝试自己实现它,并且得到了相同的结果。
最奇怪的是
Environment.getExternalStorageDirectory().listFiles()
返回空值
这是我的代码,
public class FilePickerActivity extends AppCompatActivity {
FilePickerActivity mActivity = this;
FilePickerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_picker);
ListView listView = (ListView) findViewById(R.id.list);
mAdapter = new FilePickerAdapter(this, new File("/"));//Environment.getExternalStorageDirectory());
listView.setAdapter(mAdapter);
}
private class FilePickerAdapter extends ArrayAdapter<File> {
ArrayList<File> mDataset = new ArrayList<>();
Context context;
File rootFile;
public void explore(File file){
rootFile = file;
refresh();
}
public void refresh(){
mDataset.clear();
File[] list = rootFile.listFiles();
if (list != null) {
for (File file : list) {
if (!file.isHidden()) {
mDataset.add(file);
}
}
}
notifyDataSetChanged();
}
public boolean getHigher(){
rootFile = rootFile.getParentFile();
if(rootFile == null ){
return false;
}
refresh();
return true;
}
public FilePickerAdapter(Context context,
File rootFile) {
super(context, R.layout.aaaaaaaaa_file_picker_list_item, new ArrayList<File>());
this.context = context;
this.rootFile = rootFile;
refresh();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
return mDataset.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView = LayoutInflater.from(context).inflate(R.layout.aaaaaaaaa_file_picker_list_item, parent, false);
}
final File itemFile = mDataset.get(position);
final String itemString = itemFile.getName();
((TextView) convertView.findViewById(R.id.textView)).setText(itemString);
ImageView iv = (ImageView) convertView.findViewById(R.id.iv);
if(itemFile.isDirectory()){
iv.setImageResource(R.drawable.ic_attachment_24dp);
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
explore(itemFile);
}
});
} else {
iv.setImageResource(R.drawable.ic_arrow_vector);
}
return convertView;
}
}
@Override
public void onBackPressed() {
if(!mAdapter.getHigher())
super.onBackPressed();
}
}
Thanks,
面临同样的问题。这可能是由于多种原因造成的,但我的原因是权限不当。
对于 23 以上的 API,您必须在 Manifest 中添加运行时权限。
希望它能帮助某人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)