20

我在通知中播放聲音的資產文件夾中附加了聲音文件,但我無法播放資產文件夾中的聲音。設置資產文件夾中的通知聲音

我有設置頁面,從哪個用戶可以設置聲音的通知,也可以播放聲音。這部分已完成。我可以使用Media Player從資產文件夾播放聲音。我可以在通知創建時使用相同的邏輯,但當用戶點擊通知時可能會發生問題,因爲媒體播放器仍在播放聲音。

我試圖

notification.sound = Uri.parse("file:///android_asset/Sound/Long/AlarmClock.mp3"); 

也試過這樣

notification.sound = Uri.parse("android_asset/Sound/Long/AlarmClock.mp3"); 

,但我的問題仍然沒有解決。

是否有任何其他方式來設置資產目錄通知中的聲音?

logcat的

01-10 09:57:01.509: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported 
01-10 09:57:01.509: ERROR/MediaPlayer(52): error (1, -4) 
01-10 09:57:01.519: WARN/NotificationService(52): error loading sound for android_asset/Sound/Long/audio.mp3 
01-10 09:57:01.519: WARN/NotificationService(52): java.io.IOException: Prepare failed.: status=0x1 
01-10 09:57:01.519: WARN/NotificationService(52):  at android.media.MediaPlayer.prepare(Native Method) 
01-10 09:57:01.519: WARN/NotificationService(52):  at android.media.AsyncPlayer.startSound(AsyncPlayer.java:64) 
01-10 09:57:01.519: WARN/NotificationService(52):  at android.media.AsyncPlayer.access$200(AsyncPlayer.java:33) 
01-10 09:57:01.519: WARN/NotificationService(52):  at android.media.AsyncPlayer$Thread.run(AsyncPlayer.java:99) 
01-10 09:57:01.519: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete 

或任何其他的想法?請給我提示。

+0

究竟發生了什麼? – 2012-01-10 09:49:56

+0

我已經更新了我的異常 – Dharmendra 2012-01-10 09:55:53

回答

30

把UR MP3文件res->raw folder,嘗試從raw folder獲取聲音文件。

Uri path = Uri.parse("android.resource://com.androidbook.samplevideo/" + R.raw.myvideo); 

OR

Uri path = Uri.parse("android.resource://com.androidbook.samplevideo/raw/myvideo"); 
+1

退房這個環節,我發現後不工作有趣[鏈接](http://www.anddev.org/multimedia-problems-f28/how-to-solve-pvmferrnotsupported-error-while-playing-sound-t17270.html) – rajpara 2012-01-10 10:04:12

+0

是啊,這是偉大的主意,以創建內容提供訪問內部文件 – Dharmendra 2012-01-10 10:09:43

+3

注意,我發現聲音必須是.MP3工作,不.OGG(像我們的聲音的其餘部分)。而且,正如上面rajpara表現,這也似乎有必要不包括擴展名所以我的聲音文件,push.mp3中的myproject/RES /原始文件夾,曾與:android.resource://com.mycompany.myapp/raw/push – leontx 2013-07-09 16:27:16

0

從您的資產文件夾加載內容的正確路徑是file:///android_assets/relative_path_to_your_file。在這裏注意三條斜槓。雖然我沒有試圖通過這種方式設置通知聲音,但我已經多次使用WebView成功地使用了該聲音,並且期望它以同樣的方式工作。

+0

好讓我嘗試以三條斜線 – Dharmendra 2012-01-10 09:58:24

+0

把3個斜線:( – Dharmendra 2012-01-10 10:01:29

+0

你得到同樣的錯誤在你原來的職位? – Bendik 2012-01-10 10:08:50

5

資產專用資源給應用程序,我想你將無法將它們設置爲鈴聲,您將需要一個公共文件,該文件是由媒體工藝訪問設置鈴聲。您必須將文件複製到SD卡才能將其設置爲鈴聲。

+0

是的,我認爲你是對的。要訪問私有資源,我將不得不使用內容提供者。 – Dharmendra 2012-01-10 10:10:52

0

我無法直接訪問資產音頻文件到通知。 所以我按照這個步驟,所以我能夠播放通知中的音頻

  1. 我將該文件複製到數據目錄。
  2. 靜態數據目錄無法訪問通知聲音,所以我創建了一個自定義Content Provider來共享讀取中的音頻文件,這些文件現在位於數據文件夾中。
  3. 現在在創建通知時,我已將文件的Uri設置爲Notification聲音。

現在使用此步驟,我可以將自定義聲音設置爲通知。

0

ContentProvider是要走的路。 我不認爲有必要像@Dharmendra建議的那樣將文件複製到數據目錄。 您可以直接訪問資源文件夾雖然ContentProvider的

public AssetFileDescriptor openAssetFile(Uri uri, String mode) 
     throws FileNotFoundException { 
    String filePart = Sound.getSoundFileName(uri); 

    try { 
     return getContext().getResources().getAssets().openFd(filePart + ".ogg"); 
    }catch(IOException e) { 
     Log.d(TAG, "fail " + e.getMessage()); 

    } 
    return null; 
} 
+0

以及如何從此AssetFileDescriptor獲取鈴聲? – wutzebaer 2013-08-11 17:56:33

+0

@wutzebaer您可以給NotificationCompat.Builder一個聲音的URI來與通知一起播放。 openAssetFile在你的內容提供者被賦予這個URI並且返回AssetFileDescriptor到播放通知 http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html – Chiatar 2013-09-13 04:06:14

6

這非常適合我。我在另一篇文章中發現了它。

notification.sound = Uri.parse("android.resource://my.package.name/raw/notification"); 
+0

你的Uri表示您正在訪問資源文件夾而不是資產。您正在從資源中的行文件夾引用文件。 – Dharmendra 2012-12-12 04:16:50

+0

的確如此,我們將一個聲音文件放入行文件夾並引用該文件。 – Dharmendra 2012-12-12 04:17:49