简体   繁体   English

Android wifi 状态权限

[英]Android wifi state permission

My app is communicating with another device by wifi.我的应用程序正在通过 wifi 与另一台设备通信。 I tried to ask all permissions at app's start, but is never asked about wifi.我试图在应用程序启动时询问所有权限,但从未询问过 wifi。 By the way, every time I need to change wifi, user must give permission.顺便说一句,每次我需要更改wifi时,用户都必须给予许可。 How can I ask for change wifi state permission once and never bother user again?如何一次请求更改 wifi 状态权限而不再打扰用户?

Sample of code that I used to change wifi is below我用来更改wifi的代码示例如下

WifiConfiguration wifiConfig = new WifiConfiguration();
    wifiConfig.SSID = String.format("\"%s\"", ssid);
    if (!key.equals(""))
        wifiConfig.preSharedKey = String.format("\"%s\"", key);

    final int netId = wifiManager.addNetwork(wifiConfig);

    Log.d("Network ID", Integer.toString(netId));
    wifiManager.disconnect();
    wifiManager.enableNetwork(netId, true);
    wifiManager.reconnect();

The permission my phone is asked about below下面询问我的手机的权限在此处输入图片说明

It is Russian.它是俄语。 Translation is "Would you give this app a permission to turn on/turn off WIFI?".翻译为“您是否允许此应用打开/关闭 WIFI?”。

I tested it on another phone, and it keeps happening.我在另一部手机上测试过,它一直在发生。 Both phones is xiaomi and have their own android version MIUI.这两款手机都是小米,都有自己的安卓版MIUI。

Add this code snippet in AndroidManifest.xml:在 AndroidManifest.xml 中添加以下代码片段:

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

And use this code:并使用此代码:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false); // activate/deactivate wifi

You only need to declare it in AndroidManifest.xml:你只需要在 AndroidManifest.xml 中声明:

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

Android > 6.0 user prompted runtime permission is NOT required for CHANGE_WIFI_STATE, because it is one of the safe ones. CHANGE_WIFI_STATE 不需要 Android > 6.0 用户提示的运行时权限,因为它是安全的权限之一。

If something is still goes wrong, please provide code sample which you are using.如果仍有问题,请提供您正在使用的代码示例。

UPD:更新:

Tested your code on Samsung J5 with Android 6.0 and everithing works fine.使用 Android 6.0 在三星 J5 上测试了您的代码,一切正常。

Also you are using deprecated methods.此外,您正在使用已弃用的方法。 You need to use something like this for >= Android.O你需要对 >= Android.O 使用这样的东西

In manifest:在清单中:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />

And code:和代码:

        WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid("SSID");
builder.setWpa2Passphrase("PASSWORD");

WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);

NetworkRequest nr = networkRequestBuilder1.build();
final ConnectivityManager cm = (ConnectivityManager)
        getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new
        ConnectivityManager.NetworkCallback() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                Log.d("TEST", "onAvailable:" + network);
                cm.bindProcessToNetwork(network);
            }
        };
cm.requestNetwork(nr, networkCallback);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM