[Android]許可が拒否されました(インターネット許可がありませんか?)異常なピット



Permission Denied Missing Internet Permission



まず、はじめに

プロジェクトに取り組んでいたときに、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) ...

一見すると、この異常は間違いなく思い浮かびます。これは特別な許可ではありません。 ! !しかし、物事がとても単純な場合は、髪の毛の穴を埋めてください! ! !次に、この例外について説明しましょう。




第二に、異常な原因の分析

理由1:AndroidMinifest.xmlにネットワーク権限が追加されていません

この種の例外の場合、ほとんどの場合、ネットワーク権限が追加されていないため、通常は追加するだけで済みます。

このアクセス許可は、例外によって引き起こされたクラッシュを解決できます。次に、プロジェクトで何度もチェックし、何度も確認し、例外がネットワークアクセス許可の欠如によって引き起こされたものではないと判断しました。他に理由はありますか?




原因2:ネットワークステータスのアクセス許可がAndroidMinifest.xmlに追加されていません

例外のある他のブログをチェックしました。例外が発生したときに、誰かが次の権限を追加しました。

実際には、まだ効果はありません。後で起動するときにクラッシュする必要があります。ネットワーク権限を追加するだけで、不正なポイントが流れますが、これによってこの異常が発生することはありません。正しい?
たった3秒で、再起動しますが、まだクラッシュしています~~~~~~~


第三に、問題を解決します

大画面アプリケーションの開発のため、多くのアプリケーションは起動後にバックグラウンドで実行する必要があります。起動プロセスがハングアップすると、終了します。多くの情報を確認しましたが、何が異常なのかは不明で、初期測位は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) { //This, depending on your business needs, decide how to handle the intercepted exception. 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秒後に定期的にブロードキャストを送信し、自分自身をプルアップして手動でプロセスを強制終了します。これにより、クラッシュプラットフォームが例外を大量に収集しないようになり、プロセスはそれが可能であることを保証します。通常どおり再起動します。走っているときは一度殺されたものの、事業に影響はありませんでした。この時点で、具体的な理由は見つかりませんでしたが、問題は解決しました。


第四に、最後に書く

oKhttopを使用する際にそのような例外があり、それが単純な許可の問題が原因ではない場合は、理由を通知することが期待されます、ありがとうございます。
ナゲッツに同期されます: https://juejin.im/post/5b129d295188257d86687532