当我尝试从以下代码启用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();
}
答案 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)
}
}