gpt4 book ai didi

java - 从 SD 卡播放音乐可以在模拟器上播放,但不能在手机上播放

转载 作者:行者123 更新时间:2023-12-01 14:02:50 26 4
gpt4 key购买 nike

我正在创建一个播放用户音乐的 Android 应用程序。我让它在模拟器上运行良好,但当我将它安装在手机上时它不起作用,它在这一行崩溃:

int songIndex = new Random().nextInt(songsList.size());

因为songList.size()返回0,因为当它在手机上运行时似乎找不到音乐。我已将 Micro SD 卡放入手机中,并将音乐加载到其中(在根文件夹中)。我使用以下方法来获取路径:

final String MEDIA_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();

在模拟器和手机上,返回的字符串都是/mnt/sdcard。但它仅适用于模拟器。我还在 list 文件中添加了以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

有什么想法吗?

编辑:

我没有包含这个,因为我认为它不会有太大帮助,但这是我用来实际获取歌曲列表的代码:

public ArrayList<HashMap<String, String>> getPlaylist(){
File home = new File(MEDIA_PATH);

if(home.listFiles(new FileExtensionFilter()).length > 0) {
for(File file : home.listFiles(new FileExtensionFilter())){
HashMap<String, String> song = new HashMap<String, String>();
song.put("songTitle", file.getName().substring(0, (file.getName().length() -4)));
song.put("songPath", file.getPath());

//Add song to song list
songsList.add(song);
}
}

return songsList;
}

最佳答案

怎么样

return Environment.getExternalStorageDirectory().toString() + "/Music";

这将返回内部 SD 挂载点的路径,例如“/mnt/sdcard”

这是比在路径中进行硬编码更好的编码方式。

编辑

要使其在所有设备上运行,请尝试使用 this thread 中的以下代码他们讨论 Android 除了外部存储之外没有“外部 SD”的概念。然后,OP 根据他得到的所有答案和评论,针对他的问题提出了以下解决方案。

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import android.os.Environment;
import android.util.Log;

public class ExternalStorage {

public static final String SD_CARD = "sdCard";
public static final String EXTERNAL_SD_CARD = "externalSdCard";

/**
* @return True if the external storage is available. False otherwise.
*/
public static boolean isAvailable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}

public static String getSdCardPath() {
return Environment.getExternalStorageDirectory().getPath() + "/";
}

/**
* @return True if the external storage is writable. False otherwise.
*/
public static boolean isWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;

}

/**
* @return A map of all storage locations available
*/
public static Map<String, File> getAllStorageLocations() {
Map<String, File> map = new HashMap<String, File>(10);

List<String> mMounts = new ArrayList<String>(10);
List<String> mVold = new ArrayList<String>(10);
mMounts.add("/mnt/sdcard");
mVold.add("/mnt/sdcard");

try {
File mountFile = new File("/proc/mounts");
if(mountFile.exists()){
Scanner scanner = new Scanner(mountFile);
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.startsWith("/dev/block/vold/")) {
String[] lineElements = line.split(" ");
String element = lineElements[1];

// don't add the default mount path
// it's already in the list.
if (!element.equals("/mnt/sdcard"))
mMounts.add(element);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}

try {
File voldFile = new File("/system/etc/vold.fstab");
if(voldFile.exists()){
Scanner scanner = new Scanner(voldFile);
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.startsWith("dev_mount")) {
String[] lineElements = line.split(" ");
String element = lineElements[2];

if (element.contains(":"))
element = element.substring(0, element.indexOf(":"));
if (!element.equals("/mnt/sdcard"))
mVold.add(element);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}


for (int i = 0; i < mMounts.size(); i++) {
String mount = mMounts.get(i);
if (!mVold.contains(mount))
mMounts.remove(i--);
}
mVold.clear();

List<String> mountHash = new ArrayList<String>(10);

for(String mount : mMounts){
File root = new File(mount);
if (root.exists() && root.isDirectory() && root.canWrite()) {
File[] list = root.listFiles();
String hash = "[";
if(list!=null){
for(File f : list){
hash += f.getName().hashCode()+":"+f.length()+", ";
}
}
hash += "]";
if(!mountHash.contains(hash)){
String key = SD_CARD + "_" + map.size();
if (map.size() == 0) {
key = SD_CARD;
} else if (map.size() == 1) {
key = EXTERNAL_SD_CARD;
}
mountHash.add(hash);
map.put(key, root);
}
}
}

mMounts.clear();

if(map.isEmpty()){
map.put(SD_CARD, Environment.getExternalStorageDirectory());
}
return map;
}
}

使用

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations();
File sdCard = externalLocations.get(ExternalStorage.SD_CARD);
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);

关于java - 从 SD 卡播放音乐可以在模拟器上播放,但不能在手机上播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com