Android 6.0.1无法以编程方式启用wifi热点

时间:2015-12-18 12:19:34

标签: android android-wifi android-6.0-marshmallow android-permissions

当我尝试从以下代码启用wifi网络共享时,它会抛出异常

  

java.lang.reflect.Method.invoke(Native Method)中的java.lang.reflect.InvocationTargetException ...

     

....未授予此权限:android.permission.WRITE_SETTINGS

但这在Android 6.0及以下版本中运行良好。并尝试提供 android.permission.WRITE_SETTINGS

在Android 6.1中访问wifiAP有任何限制吗?

关注我附加了用于启用热点的代码示例。

            WifiConfiguration netConfig = new WifiConfiguration();
            netConfig.SSID = ssId;
            netConfig.preSharedKey = passkey;
            netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
            netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

            try {
                boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig, true);

                for (Method isWifiApEnabledmethod : wmMethods) {
                    if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")) {
                        while (!(Boolean) isWifiApEnabledmethod.invoke(wifiManager)) {}

                        for (Method method1 : wmMethods) {
                            if (method1.getName().equals("getWifiApState")) {
                                int apstate;
                                apstate = (Integer) method1.invoke(wifiManager);
                                Log.i(TAG, "Apstate ::: " + apstate);
                            }
                        }
                    }
                }

                if (apstatus) {
                    Log.d(TAG, "Access Point created");
                } else {
                    Log.d(TAG, "Access Point creation failed");
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

5 个答案:

答案 0 :(得分:3)

我认为Android M不支持以编程方式创建热点。您可以将Marshmallow用户带到设置页面以自行创建热点。下面的代码将帮助你去设置页面。

  startActivity(
    new Intent(Settings.ACTION_SETTINGS));

答案 1 :(得分:2)

  

这不是正确的方法。但这解决了问题。

将目标sdk版本更改为21.然后即使在android 6.0.1中,hotspot也会以编程方式启动。认为应该有一个正确的方法来为Android 6及更高版本执行此操作。我认为请求运行时权限需要执行这些进程。 This talks about the android permission requesting in runtime

答案 2 :(得分:2)

设置目标SDK版本21,并在您的活动中申请write_settings权限。同时在清单中添加android.permission.WRITE_SETTINGS权限。

if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_SETTINGS)){

}else {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_SETTINGS},
            121);
}

有关详细信息,请访问http://developer.android.com/training/permissions/requesting.html

答案 3 :(得分:1)

伙计们我尝试了一切,但我无法在Android 6.0中启动热点。 您可以检查Api是否> = 23,如果是,只需将用户带到设置页面即可自行创建热点。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    final Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    final ComponentName cn = new ComponentName(
                   "com.android.settings",
                   "com.android.settings.TetherSettings");
    intent.setComponent(cn);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity( intent);
}else{
   createhotSpot();
}

答案 4 :(得分:0)

许可不是你的问题。你需要这样的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(getApplicationContext())) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 200); //You need a callback for activity result so that check if user enabled this feature, go for starting hotspot (google for it)
} else {
    // Do your stuff about starting hotspot (in network thread)
}

}