1. 程式人生 > >Android MediaPlayer 在API 28的手機上播放本地視訊正常,播放網路視訊,報錯:what=1, extra=-2147483648

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!