Reputation: 315
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"/>
Upvotes: 2
Views: 10421
Reputation: 55350
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.
Upvotes: 9