【问题标题】:Play mp3 sounds from SD card从 SD 卡播放 mp3 声音
【发布时间】:2016-02-16 14:57:20
【问题描述】:

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

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

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/com.example.android.app/files";

这基本上最终使路径“storage/Android/data/com.example.android.app/files”。

现在,在早期开发过程中,我的 raw 文件夹中确实有一些 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,这可能会有所帮助……但它可能只有等式。

编辑2: 我正在寻找here。它使用我认为不是我想要的媒体存储。

【问题讨论】:

    标签: android mp3 sd-card playback


    【解决方案1】:

    您无法在 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

    【讨论】:

    • @ZahanSafallwa:谢谢指出,现在应该修复了。
    【解决方案2】:

    根文件夹路径在android设备中可能是可变的,例如,它可以是设备中的/mnt/sdcard,另一个可以是/sdcard/。因此您可以使用一种简单的方法来提取root文件夹,使用@987654324 @ 并在定义它之后,您可以目录指向您想要的内部或外部路径中的目录。 例如:(try catch可以由IDE自动生成)

            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();
            }
    

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多