2012年4月19日 星期四

Admob 更新後出現 NoClassDefFoundError 錯誤

我是使用 Classpath Variable 來設定 Admob 的 jar 檔,由於 Admob 更新後新的 jar 檔檔名會不一樣,我猜測這時候因為 Variable 無效所以 Eclipse 主動把 Export 選項取消,造成 apk 裡面沒有 Admob 的 jar 檔而產生錯誤。

修正 Variable 的檔案路徑後,把這個選項選取就能修正這個錯誤。

(其他類似的問題也是一樣)

2012年4月11日 星期三

使用 MediaPlayer 遇到的問題

依據 SDK 文件說明,以下是 State Diagram



使用 MediaPlayer 發現一些問題

1.當 setDataSource() 是網路上的檔案(http),在呼叫 prepareAsync() 必定有一段連線的時間,如果使用者在這時候決定不播了,由於還未進入 Prepared state 而是在 Initialized state,無法呼叫 stop()、release() 來終止 MediaPlayer。
而且通常要讀取一些(Buffer)才會進入 Prepared state,也就是說呼叫 prepareAsync() 之後但是還未進入 Prepared state 的這段時間(依據網路狀態),無法中終止 MediaPlayer,目前只能在 onPrepared() 另外判斷是不是要終止 MediaPlayer。

2.stop(),如果在不適合的 state 呼叫,之後的 Player 會出現不穩或不能播其他多媒體的狀況,就算使用 try catch 也一樣,如果任何 state 都可以呼叫,那第一點也就有辦法停止。

3.當進入 Prepared state 時,OnBufferingUpdateListener 會送出一個 percent = 100 的 event,這在判斷是否已經讀完整個多媒體檔案會造成誤判,必須多使用一個 boolean 變數在 prepareAsync() 前設為 false,在 onPrepared() 設為 true,如果是 true 才是真的讀完多媒體檔案。

4.當兩個 MediaPlayer 分別在兩個 SurfaceView 同時播放同一個影片時,會造成一個 MediaPlayer 畫面延遲或斜影但聲音正常,哪一個會有問題則不一定,不知道是架構問題還是硬體問題。