Android 从SD卡播放mp3声音

Android 从SD卡播放mp3声音,android,mp3,sd-card,playback,Android,Mp3,Sd Card,Playback,我在平板电脑的SD卡上有一个名为“/Android/data/com.example.Android.app/files”的目录。我只是手动创建它,因为我不知道如何测试我的应用程序的这一方面。我将文件名存储在sqlite数据库中,如“/folder1/audio1.mp3”、“/folder2/audio1.mp3”等。。。这些文件具有相同的名称,但位于不同的文件夹中,因为它们是相同的,不同的语言。我在SD卡上的“/Android/data/com.example.Android.app/fil

我在平板电脑的SD卡上有一个名为“/Android/data/com.example.Android.app/files”的目录。我只是手动创建它,因为我不知道如何测试我的应用程序的这一方面。我将文件名存储在sqlite数据库中,如“/folder1/audio1.mp3”、“/folder2/audio1.mp3”等。。。这些文件具有相同的名称,但位于不同的文件夹中,因为它们是相同的,不同的语言。我在SD卡上的“/Android/data/com.example.Android.app/files”目录中有这些文件夹(folder1和folder2)和所有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");
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid);
mMP.reset();
mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mMP.prepare();
mMP.start();
afd.close();
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卡上的文件将更改为:

filename = "/folder1/audio.mp3"
而不是“生的”,我有:

基本上是这样玩的:

rid = getResources().getIdentifier(filname,  "raw", "com.example.android.app");
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid);
mMP.reset();
mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mMP.prepare();
mMP.start();
afd.close();
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卡上的mp3文件中获取resourceid吗?我现在这样做是否合适?是否有一种不同的方式,我应该发挥他们的工作,无论源是内部或外部内存

完全糊涂了

编辑: 我确实找到了可能有用的方法…但这可能只是等式的一部分

编辑2:
我在找。它使用mediastore,我认为这不是我想要的。

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

从Android开发者指南:

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

为了能够从内存和SD卡播放mp3,您可以执行以下操作:

rid = getResources().getIdentifier(filname,  "raw", "com.example.android.app");
AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(rid);
mMP.reset();
mMP.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mMP.prepare();
mMP.start();
afd.close();
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卡播放音频的更复杂示例:
根文件夹路径在android设备中可能是可变的,例如,它可以是设备中的
/mnt/sdcard
,另一个可以是
/sdcard/
。因此,您可以使用
android.os.Environment.getExternalStorageDirectory()使用一种简单的方法来提取
根文件夹定义后,您可以将目录指向您想要的内部或外部路径中的目录。
例如:(
try-catch
可以由IDE自动生成)


@ZahanSafallwa:谢谢你指出,现在应该修好了。