使用 WiFi 的 Instant App 崩溃

Instant App crash using WiFi

当我 运行 脚本“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)

这是预料之中的,因为即时应用程序是沙盒化的,无法访问设备的全部功能(例如 read/write)。您必须根据 whether or not you're an Instant App. Here's the full list of 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 他们讨论了 Instant Apps 的工作原理(和沙盒)。

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

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

它定义了在 Wi-Fi 状态发生任何变化时广播的各种 Intent 动作的名称。 class 的实例必须使用带有参数 WifiManager.classContext.getSystemService(Class) 或带有参数 Context.WIFI_SERVICEContext.getSystemService(String) 获得。


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" />

我们只能使用 API 限制 With Instant 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 振动