2017-09-02 100 views
0

我想打開wifi熱點程序。我用下面的代碼:android以編程方式打開wifi熱點

public class MainActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void enableHotspot(View v){ 
     WifiAccessManager.setWifiApState(this, true); 

    } 
} 

public class WifiAccessManager { 

    private static final String SSID = "1234567890abcdef"; 
    public static boolean setWifiApState(Context context, boolean enabled) { 
     //config = Preconditions.checkNotNull(config); 
     try { 
      WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      if (enabled) { 
       mWifiManager.setWifiEnabled(false); 
      } 
      WifiConfiguration conf = getWifiApConfiguration(); 
      mWifiManager.addNetwork(conf); 

      return (Boolean) mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class).invoke(mWifiManager, conf, enabled); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public static WifiConfiguration getWifiApConfiguration() { 
     WifiConfiguration conf = new WifiConfiguration(); 
     conf.SSID = SSID; 
     conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
     return conf; 
    } 
} 

權限在AndroidmManifest文件:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

我測試它在2個不同的裝置(機器人4和Android 6) 。 這是在Android 4(沒有問題)正常工作 但在Android 6不工作,並正在生成以下日誌:

java.lang.reflect.InvocationTargetException 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at ir.captainweb.wifitests.WifiAccessManager.setWifiApState(WifiAccessManager.java:20) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at ir.captainweb.wifitests.MainActivity.enableHotspot(MainActivity.java:17) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.view.View.performClick(View.java:5210) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.view.View$PerformClick.run(View.java:21328) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.os.Looper.loop(Looper.java:148) 
09-02 23:04:25.052 5220-5220/ir.captainweb.wifitests W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5551) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err: Caused by: java.lang.SecurityException: ir.captainweb.wifitests was not granted this permission: android.permission.WRITE_SETTINGS. 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at android.os.Parcel.readException(Parcel.java:1599) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at android.os.Parcel.readException(Parcel.java:1552) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at android.net.wifi.IWifiManager$Stub$Proxy.setWifiApEnabled(IWifiManager.java:1540) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err:  at android.net.wifi.WifiManager.setWifiApEnabled(WifiManager.java:1588) 
09-02 23:04:25.053 5220-5220/ir.captainweb.wifitests W/System.err: ... 14 more 

我還添加了WRITE_SETTINGS權限,但再次我有同樣的問題

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
+1

您是否進入設置並授予您的應用修改系統設置的權限?只是要求'WRITE_SETTINGS'是不夠的。請參閱[文檔](https://developer.android.com/reference/android/Manifest.permission.html#WRITE_SETTINGS)。 – CommonsWare

+0

謝謝...... :)你解決了我的問題 –

回答

0

我們必須在Android的6

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    // please check here whether you already have these permission or not. 
     requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS}, 2909); 
    } 

手動給予許可,您將得到許可WH的響應它授予或不授予以太。

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case 2909: { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.e("Permission", "Granted"); 
      } else { 
       Log.e("Permission", "Denied"); 
      } 
      return; 
     } 
    } 
} 
+0

'WRITE_SETTINGS'不是'危險'權限。 – CommonsWare