Android MediaPlayer 在API 28的手機上播放本地視訊正常,播放網路視訊,報錯:what=1, extra=-2147483648
在Android開發視訊播放器的過程中,發現一個怪異的Bug:
我是採用MediaPlayer+GLSurface實現的視訊播放器,並且作為依賴庫在Module中開發的。我利用下面的程式碼設定播放源:
MediaPlayer mediaPlayer = new MediaPlayer();
MediaPlayer.setDataSource(android.content.Context, android.net.Uri);
此處只寫用到的程式碼,其他程式碼省略。
其中Uri有兩種形式:
1.本地視訊資源的地址;
2.網路視訊資源的網址。
1.本地視訊資源的地址:
File videoFile = new File(Environment.getExternalStorageDirectory().toString()
+ File.separator + "testVideo.mp4");
if (videoFile.exists() && videoFile.isFile()) {
Uri videoUri = Uri.fromFile(videoFile);
}
2.網路視訊資源的地址:
//此處的地址是捏造的假地址,如有雷同,純屬巧合。 Uri videoUri = Uri.parse("http://google/driver/video/8169586b.mp4");
問題描述:
當我在API=27及以下的手機上和模擬機上測試時,兩種方式均能夠正常播放視訊。但是當在API=28的手機和模擬機上測試時,可以正常播放本地視訊,播放網路視訊時,MediaPlayer的OnErrorListener捕獲到了錯誤,引數值是:what=1, extra=-2147483648
檢視錯誤值 (1, -2147483648)時,“1”值對應於-2147483648”值對應十六進位制0x80000000,在frameworks / native / include / utils / Errors.h中定義為UNKNOWN_ERROR。這表明錯誤的源很難確定,因為它是一個非常通用的返回值,由編解碼器和相容性問題丟擲,但也有執行緒取消和其他幾種型別。總之,就是UNKNOWN的ERROR。
問題解決: 幾經周折,我修改了一下主工程的Build.gradle檔案中的Target_Version。
我主工程的Build.gradle檔案中的Target_Version=28, 依賴庫中的Build.gradle檔案中的Target_Version=28。我把主工程的Target_Version修改成27之後,再執行程式,發現能夠正常播放網路視訊。再測試了27以下的幾個值,也都正常。然而,依賴庫中的Build.gradle檔案中的Target_Version無論修改成什麼值,對這個問題毫無積極影響。
後遺症:
可是,我的依賴庫未來是要用到一些不確定的主工程中的,我哪管得了別人主工程的Target_Version值,萬一依賴到Target_Version=28的主工程上,那問題還是沒有解決的。
如果有哪位大神知道答案,歡迎評論留言,3X!