代码之家  ›  专栏  ›  技术社区  ›  putty174

请求android.permission.CHANGE_WIFI_STATE

  •  1
  • putty174  · 技术社区  · 12 年前

    如何请求或更改change_WIFI_STATE权限?我正在尝试扫描Wifi网络的本地区域,并在列表视图中显示结果。然而,当它运行时

    wifiMan.startScan();
    

    它崩溃并出现以下错误:

    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
    

    这是我的主叫课:

    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);
            }
    

    Receiver类

    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"/>
    
    1 回复  |  直到 12 年前
        1
  •  8
  •   matiash    12 年前

    您只需添加相关 uses-permission 在清单中标记,就像您对其他人所做的那样:

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

    有关此机制的说明,请参见 documentation .