使用WiFi即时应用崩溃

时间:2017-12-28 02:06:26

标签: android wifi aidl android-instant-apps android-binder

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

2 个答案:

答案 0 :(得分:1)

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

  • BILLING
  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_NETWORK_STATE
  • CAMERA
  • 仅在Android 8.0中
  • INSTANT_APP_FOREGROUND_SERVICE。
  • INTERNET
  • READ_PHONE_NUMBERS。此权限仅适用于Android 8.0(API级别26)。
  • RECORD_AUDIO
  • VIBRATE

PS:ADB做了一个really cool episode,讨论了Instant Apps如何工作(以及沙盒)。

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

答案 1 :(得分: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方法
  • BILLING
  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_NETWORK_STATE
  • CAMERA
  • 仅在Android 8.0中
  • INSTANT_APP_FOREGROUND_SERVICE。
  • INTERNET READ_PHONE_NUMBERS。这个许可是 仅适用于Android 8.0(API级别26)。
  • RECORD_AUDIO VIBRATE