【问题标题】:Error creating MediaPlayer with Uri or file in assets在资产中使用 Uri 或文件创建 MediaPlayer 时出错
【发布时间】:2010-06-22 13:33:36
【问题描述】:

我将 song.mp3 复制到我项目的资产目录并编写了以下代码:

private MediaPlayer mp;

Uri uri = Uri.parse("file:///android_asset/song.mp3");

mp=MediaPlayer.create(this, uri);

运行 create 语句后,变量 mp 为空。怎么了?

谢谢。

【问题讨论】:

    标签: android media-player


    【解决方案1】:

    试试这个:

    try {
        AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
        player = new MediaPlayer();
        player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
        player.prepare();
        player.start();
        } 
    catch (IllegalArgumentException e) {    } 
    catch (IllegalStateException e) { } 
    catch (IOException e) { } 
    

    【讨论】:

    • 这是为我做的。显式添加偏移量和长度。奇怪的是,仅仅给出 fd 是行不通的。
    【解决方案2】:

    试试这个,看看是否捕获到任何异常:

    try {
        MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(this, uri);
    }
    catch (NullReferenceArgument e) {
        Log.d(TAG, "NullReferenceException: " + e.getMessage());
    }
    catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException: " + e.getMessage());
    }
    catch (IOException e) {
        Log.d(TAG, "IOException: " + e.getMessage());
    }
    catch (IllegalArgumentException e) {
        Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
    }
    catch (SecurityException e) {
        Log.d(TAG, "SecurityException: " + e.getMessage());
    }
    

    捕获的异常将解释您的创建中出了什么问题。根据文档,静态创建方法只是上面 try 块中内容的简写。我可以看到的主要区别是静态方法 create 不会抛出,而 setDataSource 会抛出。

    【讨论】:

    • 我按照您的建议添加了异常处理和 mp.prepare() 语句,我在 prepare() 06-22 14:45:20.806: ERROR/PlayerDriver(554) 上收到此错误:命令 PLAYER_SET_DATA_SOURCE 以错误或信息完成 PVMFErrNotSupported 06-22 14:45:20.806: ERROR/MediaPlayer(857): error (1, -4) 06-22 14:45:20.987: DEBUG/dalvikvm(857): JDWP 调用返回 exceptObj=0x43744d68 06-22 14:45:33.056: DEBUG/ASSETTEST(857): IOException: Prepare failed.: status=0x1 0 6-22 14:45:43.068: WARN/System.err(857): java .io.IOException: Prepare failed.: status=0x1 Next?
    • 我通过修复代码来访问资产中的 mp3 文件解决了这个问题。 mp = 新媒体播放器(); AssetFileDescriptor afd = getAssets().openFd("song.mp3"); mp.setDataSource(afd.getFileDescriptor());谢谢杰尔!
    【解决方案3】:

    您最好在运行 Android N 或最新版本的设备上尝试此操作:

    try {
        AssetFileDescriptor afd = getAssets().openFd("*.mp3 / *.mp4");
        player = new MediaPlayer();
        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
        player.setDataSource(afd);
        player.prepareAsync();
        player.start();
    } catch (...) {
    }
    

    否则,请喜欢下面的最佳答案。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2017-11-12
      • 2011-11-04
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多