使用 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.class
或 Context.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/小区崩溃
cocos2d:SQLite 还是核心数据? - 需要重新设计数据库,因为我当前的应用程序非常慢或有时在没有 WiFi 的情况下崩溃