我平板电脑的SD卡上有一个名为“/Android/data/com.example.android.app/files”的目录。我刚刚手动创建它,因为我不知道如何测试我的应用程序的这个方面。我有一个存储在sqlite数据库中的文件名,如“/folder1/audio1.mp3”,“/ folder2 / audioio1.mp3”等...文件名相同,但是在不同的文件夹中,因为它们是相同的东西是不同的语言。我有这些文件夹(folder1和folder2)以及SD卡上“/Android/data/com.example.android.app/files”目录中的所有mp3文件。
所以,我从数据库中获取文件名,然后我尝试使用以下命令访问SD卡上的文件夹:
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/com.example.android.app/files";
这基本上最终会创建路径“storage / Android / data / com.example.android.app / files”。
现在,我在早期开发期间在我的原始文件夹中有几个mp3文件,但最后会有太多文件留在该文件夹中,所以我开始调查从SD卡获取它们。当我把它们放在原始状态时,我得到了它们:
rid = getResources().getIdentifier(filname, "raw", "com.example.android.app");
现在,使用SD卡上的文件,它将变为:
filename = "/folder1/audio.mp3"
而不是“原始”我有:
"storage/Android/data/com.example.android.app/files"
并基本上像这样玩:
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid);
mMP.reset();
mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mMP.prepare();
mMP.start();
afd.close();
然而,现在这种方法似乎没有同样的方法。
你能从SD卡上的mp3文件中获取resourceid吗?这对我来说甚至是适当的方式吗?是否有一种不同的方式我应该播放它们,无论源是内部存储器还是外部存储器都能工作?
彻底混淆。
编辑: 我确实发现this可能有所帮助......但它可能只有等式。
EDIT2: 我正在寻找here。它使用我认为不是我想要的媒体商店。
答案 0 :(得分:11)
您无法获取SD卡中mp3的资源ID,因为此mp3不属于项目中的资源文件夹,因此没有资源ID。
来自Android开发者指南:
编译应用程序时,aapt会生成R类,其中包含res /目录中所有资源的资源ID。
为了能够从内存和SD卡播放mp3,你可以这样做:
try {
FileDescriptor fd = null;
if (isInInternalMemory(audioFilename)) {
int audioResourceId = mContext.getResources().getIdentifier(audioFilename, "raw", "com.ampirik.audio");
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(audioResourceId);
fd = afd.getFileDescriptor();
} else if (isInSdCard(audioFilename)) {
File baseDir = Environment.getExternalStorageDirectory();
String audioPath = baseDir.getAbsolutePath() + audioFilename + ".mp3";
FileInputStream fis = new FileInputStream(audioPath);
fd = fis.getFD();
}
if (fd != null) {
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(fd);
mediaPlayer.prepare();
mediaPlayer.start();
}
} catch (Exception e) {
e.printStackTrace();
}
这只是一个展示它如何工作的示例,显然你应该调整它以指向存储音频文件的文件夹,并以适当的方式处理你需要的例外。
编辑: 此外,您还可以在此处查看有关如何从SD卡播放音频的更复杂示例: https://github.com/ankidroid/Anki-Android/blob/develop/AnkiDroid/src/main/java/com/ichi2/libanki/Sound.java
答案 1 :(得分:0)
根文件夹路径在Android设备中可能是变量的,例如,它可以是设备中的/mnt/sdcard
而另一个可以是/sdcard/
。因此,您可以使用简单的方法来提取{{1}使用root
文件夹,在定义之后,你可以将目录指向你想要的内部或外部路径中的目录。
例如:(android.os.Environment.getExternalStorageDirectory();
可以由IDE自动生成)
try catch