簡體   English   中英

使用 Uri 或資產中的文件創建 MediaPlayer 時出錯

[英]Error creating MediaPlayer with Uri or file in assets

我將 song.mp3 復制到我項目的資產目錄並編寫了以下代碼:

private MediaPlayer mp;

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

mp=MediaPlayer.create(this, uri);

運行 create 語句后,變量 mp 為空。 怎么了?

謝謝。

嘗試這個:

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

試試這個,看看是否有任何異常被捕獲:

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

捕獲的異常將解釋您的創建中出了什么問題。 根據文檔,靜態 create 方法只是上面 try 塊中內容的簡寫。 我可以看到的主要區別是靜態方法 create 不會拋出而 setDataSource 會拋出。

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

否則,請喜歡下面的最佳答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM