Похоже, что ваше приложение не имеет разрешения на чтение из внешнего хранилища.Напишите это:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
непосредственно перед тегом <application
в вашем manifest.xml
Поместите это объявление:
ArrayList<String> myList = new ArrayList<String>();
вместо onCreate()
на уровне класса (до onCreate()
), чтобы сделать его видимым в любом месте вашего класса активности.Создайте этот метод:
private void fillList() {
String root_sd = Environment.getExternalStorageDirectory().toString();
File file = new File(root_sd + "/datanfile");
File list[] = file.listFiles();
for (int i = 0; i < list.length; i++) {
myList.add(list[i].getName());
}
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList));
}
и в onCreate()
используйте только этот код:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); ???????
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
fillList();
} else {
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
}
}
Таким образом, ваше приложение будет запрашивать необходимое разрешение, если оно еще не предоставлено.Теперь вы получите, предоставил ли пользователь это разрешение, переопределив onRequestPermissionsResult()
:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
fillList();
}
}
}
}
Вышеуказанный метод вызывается после того, как пользователь принял или не предоставил вашему приложению разрешение.Таким образом, fillList()
будет выполнено, если ваше приложение уже имеет разрешение или после того, как пользователь предоставит разрешение.Он не будет выполнен, если пользователь не предоставит разрешение. Редактировать В опубликованном вами методе onCreate()
нет setContentView()
.Зачем? Edit2 В вашем коде у вас есть:
private void checkAndCreateDirectory() {
}
public void checkAndCreateDirectory(String dirName){
File new_dir = new File( root_sd + "/sdcard/myaudio/" );
if( !new_dir.exists() ){
new_dir.mkdirs();
}
}
Удалите 1-е и удалите String dirName
из 2-го