安卓棒棒糖 - WiFi 热点 setWifiApEnabled() get InvocationTargetException

5
我正在使用这个应用程序。
setWifiApEnabled()

使用反射来访问隐藏API。在一些老的手机上它可以工作(比如三星Galaxy S3、4.4系统的某些手机等),但是我在三星Galaxy S5上测试时出现了

java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
...

我正在使用类似于这个Android 2.2 wifi热点API 如何设置Android WifiConfiguration.preSharedKey以连接到WPA2 PSK WiFi网络 的代码,但这个代码有点老了。

你有相关经验吗?你有什么建议吗?

附:它在一些Android 4.4设备上也不起作用(但我没有得到InvocationTargetException错误)。

5个回答

3

试试这个。

ConnectivityManager cman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        Method[] methods = cman.getClass().getMethods();

        try
        {
            wifiManager.setWifiEnabled(false);
            Method enableWifi = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            String ssid  =   " " //your SSID 
            String pass  =   " " // your Password
            WifiConfiguration  myConfig =  new WifiConfiguration();
            myConfig.SSID = ssid;
            myConfig.preSharedKey  = pass ;
            myConfig.status = WifiConfiguration.Status.ENABLED;
            myConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            myConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            myConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            myConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
            myConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
            myConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
            myConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            result = (Boolean) enableWifi.invoke(wifiManager, myConfig, true);

        } 
        catch (Exception e) 
        {
            e.printStackTrace();
            result = false;
        }

如果出现异常,请尝试在您的清单中添加此权限:android.permission.WRITE_SETTINGS



3

您需要将以下权限添加到您的AndroidManifest.xml文件中:

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

这对我有效。


2

我有同样的问题。

在清单文件中添加android.permission.WRITE_SETTINGS,它就可以工作了。您可以尝试这个方法。


2
public void setWiFiApMode(boolean mode) {
        if (mContext == null) return;
        WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
        if (wifiManager == null) return;
        try {
            Method setWifiApEnabled = WifiManager.class.getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            setWifiApEnabled.invoke(wifiManager, null, mode);
        } catch (Exception e) {
        }
    }

而且。
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

完全在Android N上运作。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接