有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无法使用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) 个答案

  1. # 1 楼答案

    尝试将其添加到AndroidManifest中的<application>标记中。xml:

    android:requestLegacyExternalStorage="true"
    

    在Android 10及更高版本中,他们改变了外部存储的工作方式(作用域存储),此代码片段允许您恢复到传统存储API,以便完全访问外部存储

    更新:对于Android 11及更高版本,使用MediaStore API或使用getExternalFilesDirs()作为应用程序特定目录(请注意,您需要将歌曲从外部存储目录移动到应用程序特定目录),应用程序特定目录如下所示:

    Android/data/com。公司名称。appname

    但是对于Android 10(API级别29)兼容性,您可以使用API级别检查来包围文件获取代码,如果级别为30或更高(Android 11或更高),则使用getExternalFilesDirs(),否则使用传统存储API