简体   繁体   中英

Request android.permission.CHANGE_WIFI_STATE

How do you request or change the CHANGE_WIFI_STATE permission? I'm trying to scan the local area for Wifi Networks and displaying the result in a list view. However, when it runs

wifiMan.startScan();

It crashes with the following error:

07-08 16:43:20.765: E/AndroidRuntime(13725): FATAL EXCEPTION: main
07-08 16:43:20.765: E/AndroidRuntime(13725): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wdi.wdigateway/com.wdi.wdigateway.SelectGateway}: java.lang.SecurityException: WifiService: Neither user 10111 nor current process has android.permission.CHANGE_WIFI_STATE.
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread.access$600(ActivityThread.java:135)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.os.Looper.loop(Looper.java:137)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread.main(ActivityThread.java:4849)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at java.lang.reflect.Method.invoke(Method.java:511)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at dalvik.system.NativeStart.main(Native Method)
07-08 16:43:20.765: E/AndroidRuntime(13725): Caused by: java.lang.SecurityException: WifiService: Neither user 10111 nor current process has android.permission.CHANGE_WIFI_STATE.
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.os.Parcel.readException(Parcel.java:1425)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.os.Parcel.readException(Parcel.java:1379)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.net.wifi.IWifiManager$Stub$Proxy.startScan(IWifiManager.java:651)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.net.wifi.WifiManager.startScan(WifiManager.java:726)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at com.wdi.wdigateway.SelectGateway.onCreate(SelectGateway.java:52)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.Activity.performCreate(Activity.java:5244)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
07-08 16:43:20.765: E/AndroidRuntime(13725):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)
07-08 16:43:20.765: E/AndroidRuntime(13725):    ... 11 more

Here is my calling class:

public class SelectGateway extends ActionBarActivity {

        WifiManager wifiMan;
        WifiReciever wifiRec;
        List<ScanResult> wifiList;
        ArrayAdapter<String> gateways;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_select_gateway);

            if (savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.container, new PlaceholderFragment()).commit();
            }

            wifiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            if(wifiMan.isWifiEnabled() == false) {
                Toast.makeText(getApplicationContext(), "wifi no good", Toast.LENGTH_SHORT).show();
                wifiMan.setWifiEnabled(true);
            }
            wifiRec = new WifiReciever();
            registerReceiver(wifiRec, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
            wifiMan.startScan(); //<------Code Crashes here

            ListView list = (ListView) findViewById(R.id.listView1);
            gateways = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
            gateways.add("One");
            gateways.add("two");
            gateways.add("three");
            list.setAdapter(gateways);
        }

The Receiver class

class WifiReciever extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            wifiList = wifiMan.getScanResults();
            for(int i=0;i<wifiList.size();i++){
                gateways.add(wifiList.get(i).toString());
            }
        }
    }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wdi.wdigateway"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

You just need to add the relevant uses-permission tag in the manifest, as you're doing with the others:

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

See the explanation about this mechanism in the documentation .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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