无法使用Java读取Android的mp3文件
这是主要的活动。爪哇:
import 安卓x.annotation.RequiresApi;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓.Manifest;
import 安卓.os.Build;
import 安卓.os.Bundle;
import 安卓.os.Environment;
import 安卓.widget.ArrayAdapter;
import 安卓.widget.ListView;
import 安卓.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, 安卓.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;
}
}
仅供参考,我正在一台装有安卓10的物理设备上运行此程序
public ArrayList<File> fetchSongs (File file)
函数中的'file'参数不是null,并且是一个目录,但如果运行返回null的file.listFiles()
,则该参数位于同一个函数中
我确实下载了两个mp3文件
我的雄激素清单。xml文件已声明读取外部存储的权限:
<uses-permission 安卓:name="安卓.permission.READ_EXTERNAL_STORAGE" />
我不知道只有当你有if(if(songs!=null)songs!=null)设备上的外部SD卡,但我正在设备自身的存储上运行此功能
编辑:当我在另一台装有安卓9的物理设备上运行时,它运行得非常完美
非常感谢您的帮助。 多谢各位
# 1 楼答案
尝试将其添加到AndroidManifest中的
<application>
标记中。xml:在Android 10及更高版本中,他们改变了外部存储的工作方式(作用域存储),此代码片段允许您恢复到传统存储API,以便完全访问外部存储
更新:对于Android 11及更高版本,使用MediaStore API或使用
getExternalFilesDirs()
作为应用程序特定目录(请注意,您需要将歌曲从外部存储目录移动到应用程序特定目录),应用程序特定目录如下所示:Android/data/com。公司名称。appname
但是对于Android 10(API级别29)兼容性,您可以使用API级别检查来包围文件获取代码,如果级别为30或更高(Android 11或更高),则使用
getExternalFilesDirs()
,否则使用传统存储API