使用Uri或资产中的文件创建MediaPlayer时出错

时间:2010-06-22 13:33:37

标签: android media-player

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

private MediaPlayer mp;

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

mp=MediaPlayer.create(this, uri);

运行create语句后,变量mp为null。有什么问题?

感谢。

3 个答案:

答案 0 :(得分:21)

试试这个:

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) { } 

答案 1 :(得分:6)

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

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执行时抛出。

答案 2 :(得分:0)

您最好在运行 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 (...) {
}

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