使用 WiFi 的即时应用程序崩溃

Posted

技术标签:

【中文标题】使用 WiFi 的即时应用程序崩溃【英文标题】:Instant App crash using WiFi 【发布时间】:2017-12-28 02:06:26 【问题描述】:

当我运行脚本“WifiManager.isWifiEnable”时,我的即时应用程序崩溃

 Caused by: java.lang.SecurityException: Method class android.net.wifi.IWifiManager$Stub$Proxy.getWifiEnabledState[] not available to instant apps
                                                 at android.os.Parcel.readException(Parcel.java:1620)
                                                 at android.os.Parcel.readException(Parcel.java:1573)
                                                 at com.google.android.instantapps.supervisor.ipc.base.MethodInvocationProxy.readReply(MethodInvocationProxy.java:238)
                                                 at com.google.android.instantapps.supervisor.ipc.base.MethodInvocationProxy.invoke(MethodInvocationProxy.java:472)
                                                 at java.lang.reflect.Proxy.invoke(Proxy.java:393)
                                                 at $Proxy15.getWifiEnabledState(Unknown Source)
                                                 at android.net.wifi.WifiManager.getWifiState(WifiManager.java:1459)
                                                 at android.net.wifi.WifiManager.isWifiEnabled(WifiManager.java:1471)

【问题讨论】:

向 Manifest 文件添加 Wifi 权限 【参考方案1】:

WifiManager 此类提供用于管理 Wi-Fi 连接所有方面的主要 API。

它定义了在 Wi-Fi 状态发生任何变化时广播的各种 Intent 操作的名称。 必须使用 Context.getSystemService(Class) 和参数 WifiManager.classContext.getSystemService(String) 和参数 Context.WIFI_SERVICE 来获取此类的实例。

setWifiEnabled 需要 CHANGE_WIFI_STATE

这是执行 Wi-Fi 特定操作时使用的 API。要在抽象级别执行与网络连接相关的操作,请使用 ConnectivityManager

private boolean isNetworkAvailable() 
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();

您需要:

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

我们只能使用受限于 Instant permissions 的 API 方法

计费 ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION ACCESS_NETWORK_STATE 相机 INSTANT_APP_FOREGROUND_SERVICE 仅在 Android 8.0 中。 INTERNET READ_PHONE_NUMBERS。这个权限是 仅在 Android 8.0(API 级别 26)中可用。 RECORD_AUDIO 振动

【讨论】:

【参考方案2】:

这是意料之中的,因为 Instant Apps 是沙盒化的,并且无法访问设备的全部功能(例如,没有读/写)。您必须根据whether or not you're an Instant App 解决此问题。这是available permissions的完整列表:

计费 ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION ACCESS_NETWORK_STATE 相机 INSTANT_APP_FOREGROUND_SERVICE 仅适用于 Android 8.0。 互联网 READ_PHONE_NUMBERS。此权限仅在 Android 8.0(API 级别 26)中可用。 RECORD_AUDIO 振动

PS:ADB 做了一个really cool episode,在那里他们讨论了即时应用程序的工作原理(以及沙盒)。

另见:https://github.com/googlesamples/android-instant-apps/issues/12

【讨论】:

谢谢,所以即时应用真的不支持aidl? 免安装应用不支持某些权限来保护用户,但 AIDL 可用于任何进程间通信。你只是想看看是否有互联网连接?如果是这样,我会看看这个答案:***.com/a/4239019/4548500。

以上是关于使用 WiFi 的即时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

React Native (iOS) 应用程序在 wifi 上加载良好; LTE/小区崩溃

使 Android 应用程序崩溃的最佳方法是啥?

即时运行和谷歌地图的问题

cocos2d:SQLite 还是核心数据? - 需要重新设计数据库,因为我当前的应用程序非常慢或有时在没有 WiFi 的情况下崩溃

带有 shouldInterceptRequest 覆盖的 Android WebView 即时崩溃

HttpURLConnection 应用程序因 ESP8266 崩溃