问题
I need a file picker in my application, after having tried third party libraries that didn't work (no content), I tried to implement it myself, and I have the same result.
The wierdest thing is that
Environment.getExternalStorageDirectory().listFiles()
returns null
here is my code,
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,
回答1:
Faced the same Issue. This could be due to many reasons, but mine was improper permissions. For API above 23, You have to add Run-time permissions and also in Manifest. Hope it helps someone.
回答2:
see if your SDCard mounted;
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
来源:https://stackoverflow.com/questions/33891781/environment-getexternalstoragedirectory-listfiles-returns-null