【发布时间】:2021-08-03 20:28:53
【问题描述】:
这是 MainActivity.java:
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Dexter.withContext(this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
ArrayList<File> songs = fetchSongs(Environment.getExternalStorageDirectory());
String[] items = new String [songs.size()];
for (int i = 0; i < songs.size(); i++) {
items[i] = songs.get(i).getName().replace(".mp3", "");
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, items);
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
})
.check();
}
public ArrayList<File> fetchSongs (File file) {
ArrayList arrayList = new ArrayList();
File [] songs = file.listFiles();
if (songs != null) {
for (File song : songs) {
if (song.isDirectory() && !song.isHidden()) {
arrayList.addAll(fetchSongs(song));
} else {
if (song.getName().endsWith(".mp3") && !song.getName().startsWith(".")) {
arrayList.add(song);
}
}
}
}
return arrayList;
}
}
仅供参考,我在装有 Android 10 的物理设备上运行它。
public ArrayList<File> fetchSongs (File file) 函数中的 'file' 参数不是 null 并且是一个目录,但如果我运行返回 null 的 file.listFiles() 则在同一个函数中。
我确实下载了两个 mp3 文件。
我的 AndroidManifest.xml 文件已经声明了读取外部存储的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我不知道这是否仅在您的设备上有 if (if (songs != null)songs != null) 外部 SD 卡但我在设备自己的存储上运行时才有效。
编辑:当我在另一台装有 Android 9 的物理设备上运行它时,它运行完美。
非常感谢任何帮助。 谢谢你
【问题讨论】:
-
您在 Android 11+ 上无权访问外部存储的根目录。请使用
MediaStore。 -
你的手机是哪个安卓版本的?
-
@Anna 我使用的是 Android 10
-
@CommonsWare 我在我的物理设备上运行 Android 10
-
如果我在另一台装有 Android 9 的物理设备上运行它,它会完美运行。
标签: java android xml file permissions