【问题标题】:Can't read mp3 files Android using Java无法使用 Java 读取 mp3 文件 Android
【发布时间】: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&lt;File&gt; fetchSongs (File file) 函数中的 'file' 参数不是 null 并且是一个目录,但如果我运行返回 null 的 file.listFiles() 则在同一个函数中。

我确实下载了两个 mp3 文件。

我的 AndroidManifest.xml 文件已经声明了读取外部存储的权限: &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;

我不知道这是否仅在您的设备上有 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


【解决方案1】:

尝试在 AndroidManifest.xml 中的 &lt;application&gt; 标记内添加:

android:requestLegacyExternalStorage="true"

在 Android 10 及更高版本中,他们更改了外部存储的工作方式(范围存储),此代码 sn-p 允许您恢复到旧版存储 API,以便完全访问外部存储

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

Android/data/com.companyname.appname

但是为了兼容 Android 10(API 级别 29),您可以使用 API 级别检查围绕文件获取代码,如果级别为 30 及更高(Android 11 及更高)则使用getExternalFilesDirs(),否则使用旧版存储 API

【讨论】:

  • @CommonsWare 我知道,但这是 Android 10 用户的长期解决方案
  • @OdedAhmed 我更新了答案以包含适用于 Android 11+ 的解决方案
猜你喜欢
  • 2012-07-05
  • 2015-08-19
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多