【问题标题】:How to detect that a firewall has blocked Internet access to some app?如何检测防火墙阻止了对某些应用程序的 Internet 访问?
【发布时间】:2012-11-23 05:25:01
【问题描述】:

此应用必须在没有有效互联网连接的情况下运行。但是,如果 DroidWall 等防火墙应用程序拒绝访问 Internet(防火墙规则),则通过 ConnectivityManagerNetworkInfo 检查 Internet 连接不起作用。

如何检测到某些防火墙应用程序阻止了对我的应用程序的 Internet 访问?

例如,如果我启动 Google Play Store 应用程序,它会明确指出“没有互联网连接”。如果我启动我的应用程序,它会挂起(尝试下载内容)然后崩溃并出现错误。

编辑

这是由 Logcat 捕获的错误。

12-05 12:44:51.417: E/AndroidRuntime(18922): java.lang.RuntimeException: An error occured while executing doInBackground()
12-05 12:44:51.417: E/AndroidRuntime(18922):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.lang.Thread.run(Thread.java:856)
12-05 12:44:51.417: E/AndroidRuntime(18922): Caused by: java.lang.NullPointerException
12-05 12:44:51.417: E/AndroidRuntime(18922):    at com.app.android.MainActivity$ParserAsyncTask.doInBackground(MainActivity.java:345)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at com.app.android.MainActivity$ParserAsyncTask.doInBackground(MainActivity.java:367)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-05 12:44:51.417: E/AndroidRuntime(18922):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-05 12:44:51.417: E/AndroidRuntime(18922):    ... 5 more

如您所见,当应用程序启动并且解析器开始下载远程内容时,检测互联网连接(wifi 或移动数据)是否存在的机制失败了。

我需要实现额外的功能,允许 Internet 连接机制检查某些应用程序是否被某些防火墙规则阻止(例如 Play 商店应用程序)。

【问题讨论】:

  • 能否请您发布错误?完全例外。
  • 试着按照我下面的建议去做。并在 mainactivity.java 第 345->367 行添加引发 NullPointerException 的代码。防火墙很可能导致您的连接变量变为空,而您没有对此进行测试。只需检查它返回的内容即可解决您的问题。

标签: android firewall


【解决方案1】:

如果您的应用程序崩溃,那么它会引发您没有捕获的异常。

尝试用try/catch and pop a toast notification 包围您的连接代码,表示没有可用的互联网连接。另外,从调试工具中发布异常?我很好奇你得到了什么异常,因为你没有发布任何代码......

【讨论】:

  • 谢谢,但我知道这种方法:)。我希望有一种方法可以检测到某些防火墙应用程序正在阻止访问。
  • 有。检查底层操作系统的 iptables。如果您尝试访问的网站的 IP 被那里的规则阻止,则它是由防火墙应用程序添加的 - 当然,该应用程序使用 iptables 来限制访问。不幸的是,这不是一件容易的事,因为代码只能在有根手机上运行,​​并且您可能会遇到与不同改装操作系统的兼容性问题。只需检查天气连接是否为空以查找受限互联网、未找到您的部分“故障”(错误 ip、错误主机名)的主机异常或通过您已经使用的方式检查网络连接
  • 默认 Android 操作系统上的 Google Playstore 不会以 root 身份运行,也不会检测防火墙,它只是处理异常
  • 我认为你可能是对的。我忘记了有根和无根电话。我将把它作为回复保留一两天。如果有人没有提出更好的解决方案,我会将您的标记为答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2014-07-26
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多