【Android】Permission denied (missing INTERNET permission?)異常踩坑

XuYanjun發表於2018-06-02

一、簡介

自己在做專案的時候,發現APK在某廠家的一款機頂盒上開機啟動的時候,接收開機廣播拉起程式之後,程式突然崩潰,如果再次拉起程式,又能夠正常使用了,經過全域性異常捕獲發現,導致程式崩潰的原因居然是okhttp中丟擲的一個異常:

java.lang.SecurityException Permission denied (missing INTERNET permission?)
    at java.net.InetAddress.lookupHostByName(InetAddress.java 418)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java 236)
    at java.net.InetAddress.getAllByName(InetAddress.java 214)
    at okhttp3.Dns$1.lookup(Dns.java 39)
    at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java 170)
    at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java 136)
    at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java 81)
    ...
複製程式碼

第一眼看這個異常,肯定會想到,這特麼的是沒有加許可權啊!!!然而事情如果有這麼簡單的話,還填個毛的坑啊!!!接下來,講一下關於這個異常的情況。


二、異常原因分析

原因一:AndroidMinifest.xml中未新增網路許可權

對於這種異常,大部分情況下確實因為沒有新增網路許可權導致的,一般只需要新增

<uses-permission android:name="android.permission.INTERNET" />

該許可權即可解決該異常引起的崩潰,然後我再專案中查了一遍又一遍,確認了一次又一次,確定不是由於未新增網路許可權導致的該異常,難道還有其他原因?


原因二:AndroidMinifest.xml中未新增網路狀態許可權

檢視了出現該異常的其他部落格,也有人在出現該異常時新增如下許可權就解決了的

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

事實上,依然沒有效果,開機該崩潰還得崩潰;後來在想幹脆將網路許可權都加上,流氓點就流氓點,但該總不會導致這個異常了吧? 爽不過三秒,開啟重啟,還是崩潰了~~~~~~~


三、解決問題

因為做大屏應用開發,很多應用需要在開機之後就要後臺執行,如果開機程式掛了不能起來就玩完了。查了很多資料,目前尚不明確具體什麼原因導致的該異常,初步定位為與ROM有關,但事情總得想法子解決的。如何解決? 既然是okHttp網路訪問出現的異常導致的崩潰,那麼我這邊想法是通過okHttp攔截器來攔截該異常,並做相關處理。具體的攔截器寫法如下:

public class InternetPermissionExceptionInterceptor implements Interceptor {
    private static final String PERMISSION_EXCEPTION = "Permission denied (missing INTERNET permission?)";

    @Override
    public Response intercept(Chain chain) throws IOException {
        try {
            return chain.proceed(chain.request());
        } catch (Throwable e) {
            if (PERMISSION_EXCEPTION.equals(e.getMessage()) || e instanceof SecurityException) {
                //此處,根據自己的業務需求來決定如何處理攔截到的該異常
                AlarmTimer.setAlarmTimer(
                        XMContext.AppContext(),
                        System.currentTimeMillis() + 1000 * 10,
                        AlarmTimer.TIMER_ACTION,
                        BootBroadcastReceiver.class);

                System.exit(0);
            }
            if (e instanceof IOException) {
                throw e;
            } else {
                throw new IOException(e);
            }
        }
    }
}
複製程式碼

此處,因為我們的專案一下幾個要點: 1、必須保證開機能夠正常啟動 2、有專門的崩潰收集平臺

所以我這裡就是先搞一個定時器,10秒後定時傳送廣播,拉起自己,同時手動kill掉程式,這樣既保證了崩潰平臺不會大批量收集該異常,同時程式保證也能夠正常再開機的時候執行,雖然kill了一次,但不影響業務,至此,雖然沒找到具體的原因,但還是解決了該問題。


四、寫在最後

如果有哪位在使用oKhttop的時候也出現了這類異常,並且不是由於簡單的許可權問題導致的,分析到了原因還望告知,謝謝。 同步釋出於簡書:https://www.jianshu.com/p/ade033e023e3

相關文章