解決android 9上無法使用http協議


用戶反應本來好用的app,突然無法訪問服務器,不能正常用了,拿到手機,從頭檢查權限,重新安裝都不能解決,網絡是正常的,怎么就不能訪問網絡了呢?所有想到的辦法都用了而不能解決,最后想起看一下android版本,原來升級到9了!

看Delphi上如何解決這個問題:

第一步:制作配置文件network_security_config.xml,下面是內容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在項目文件夾建一個子文件夾res/xml,把network_security_config.xml保存到res/xml下。

第二步:.修改項目的AndroidManifest.template文件

下面是我修改的結果,在applicaiton段增加了networkSecurityConfig一行

    <application android:persistent="%persistent%"
        android:restoreAnyVersion="%restoreAnyVersion%"
        android:label="%label%"
        android:debuggable="%debuggable%"
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%" android:networkSecurityConfig="@xml/network_security_config"
        >

在application段,增加一行,引用第一步制作的文件network_security_config.xml

android:networkSecurityConfig="@xml/network_security_config"

注意:一定要寫對位置,我就犯了錯,因為沒寫對,浪費幾個小時。

第三步:發布network_security_config.xml

通過Project->Deployment菜單,打開發布文件窗口,把 network_security_config.xml加進去,如下圖:

注意,發布文件路徑,即Remote Path為res\xml\

保存后,重新編譯項目,正常情況下,問題就解決了。

如果以前編譯過項目,為了要重新生成AndroidManifest.xml文件,你可以Clear項目,也可以手工把生成過的AndroidManifest.xml刪除,這個文件在Android\Release文件夾中。手工刪除,會減少編譯的時間。

這一步也非常重要,我就遇到不重新生成AndroidManifest.xml的問題。

關於原理,下面這篇文章寫的非常好,感興趣可以參考:

https://blog.csdn.net/gengkui9897/article/details/82863966

最后,感謝ChinaCock作者提醒我參考他寫的視頻播放Demo app,里面就是這樣實現的。

如果你不知道ChinaCock是什么?可以看我寫過的對ChinaCock組件使用說明的文章,也可以加入他的官方群223717588去進一步了解。如果沒項目,沒錢,就不用去了,沒有免費版本來學習。

后記:高勇針對上面的實現,給了更簡單的實現方法,以下為他寫的原文:

解決安卓9不讓客戶端通過非https方式訪問服務端數據(不允許發送明文http請求)的問題。

1、選擇安卓平台編譯一次程序,在項目根目錄下會生成如下文件AndroidManifest.template.xml
2、打開此文件,在正確位置加上以下權限即可:android:usesCleartextTraffic="true"

類似如下:

<application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%"

    android:usesCleartextTraffic="true"

        android:resizeableActivity="false">

直接在AndroidManifest.template.xml中定義使用http訪問,確實簡單!

下面這篇文章,分析更透,可以進一步參考學習:

源碼分析 Android 9.0 http請求適配原理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM