首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >播放SD卡中的mp3声音

播放SD卡中的mp3声音
EN

Stack Overflow用户
提问于 2011-11-06 03:00:58
回答 2查看 16.3K关注 0票数 8

我在平板电脑的SD卡上有一个名为"/Android/data/com.example.android.app/files".的目录我只是手动创建它,因为我不知道如何测试我的应用程序的这一方面。我将文件名存储在sqlite数据库中,如“/folder1/a o1.mp3”、“/folder2/a o1.mp3”等……这些文件具有相同的名称,但位于不同的文件夹中,因为它们是相同的东西是不同的语言。

因此,我从数据库中获取文件名,并尝试使用以下命令访问SD卡上的文件夹:

代码语言:javascript
复制
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/com.example.android.app/files";

这基本上就是将路径设置为"storage/Android/data/com.example.android.app/files".

当我把它们放在生鲜的时候,我是这样买的:

代码语言:javascript
复制
rid = getResources().getIdentifier(filname,  "raw", "com.example.android.app");

现在,对于SD卡上的文件,它更改为:

代码语言:javascript
复制
filename = "/folder1/audio.mp3"

而不是“原始”,我有:

代码语言:javascript
复制
"storage/Android/data/com.example.android.app/files"

基本上是这样玩的:

代码语言:javascript
复制
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid);
mMP.reset();
mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mMP.prepare();
mMP.start();
afd.close();

然而,所有这些方法现在似乎都不再以同样的方式工作。

您能从SD卡上的mp3文件中获取资源SD吗?这是我现在做这件事的合适方式吗?有没有一种不同的播放方式,无论信号源是内部存储器还是外部存储器,都可以工作?

彻底迷惑了。

编辑:我确实找到了this,它可能只是方程式的help...but。

EDIT2:我正在寻找here。它使用mediastore,我不认为这是我想要的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-06 16:20:51

您无法在SD卡中获取mp3的资源ID,因为此mp3不属于您的项目中的资源文件夹,因此没有资源ID。

来自Android开发人员指南:

编译应用程序时,aapt会生成R类,该类包含res/目录中所有资源的资源in。

为了能够同时从内部存储器和SD卡播放mp3,您可以这样做:

代码语言:javascript
复制
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

票数 12
EN

Stack Overflow用户

发布于 2013-09-05 05:59:52

根文件夹路径可以是可变的在安卓设备,例如,它可以是一个设备的/mnt/sdcard和另一个可以是/sdcard/ .therefore你可以使用一个简单的方式解压缩root文件夹使用android.os.Environment.getExternalStorageDirectory();和定义它后,你可以目录指向你的目录在内部或外部的路径,你想要的。例如:( try catch可以由集成开发环境自动生成)

代码语言:javascript
复制
        mediaPlayer = new MediaPlayer();
        final File root = android.os.Environment.getExternalStorageDirectory();
        try {

            mediaPlayer.setDataSource(root.getAbsolutePath() + AUDIO_FILES_DIRECTORY+"/musicFile.MP3");

        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {

            mediaPlayer.prepare();

        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8022506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档