11

Tôi đã xem chủ đề này (Android: How to Enable/Disable Wifi or Internet Connection Programmatically) rất giống với những gì tôi muốn hỏi. Tôi đã thử các giải pháp được cung cấp bởi một câu trả lời được đăng bởi Ashish Sahu (https://stackoverflow.com/users/1780737/ashish-sahu) mà dường như làm việc hoàn hảo trên các phiên bản Android khác ngoài Marshmallow (6.0).Android: Bật/Tắt Điểm phát sóng WiFi Lập trình trên Android Marshmallow (6.0)

Có cách nào để chuyển đổi và thiết lập Điểm phát sóng WiFi trên Android Marshmallow không? Tôi đã thử sử dụng mHotspot (http://www.mhotspot.com/) có thể thực hiện công việc trên Android Marshmallow nhưng tôi không biết cách triển khai nó.

Xin cảm ơn trước.

+2

Tôi quản lý để khắc phục sự cố bằng cách sử dụng mã được cung cấp cho Ashish Sahu của tôi trong http://stackoverflow.com/questions/6394599/android-turn-on-off-wifi-hotspot-programmatically. Và sửa targetSdkVersion của tôi thành thấp hơn 23 trong build.gradle. Các mã được cung cấp bởi Lex Hobbit trong câu trả lời cũng hoạt động quá nhưng mã được cung cấp bởi Ashish Sahu, như đã đề cập trước đây, trông sạch hơn. – user2826067

Trả lời

6

câu trả lời của tôi cho câu hỏi này là:

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiManager; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.util.Log; 

public class WifiAPController extends Activity { 
    public int a; 
    public int b; 
    public String password; 
    public String APname; 

    private static int g; 
    private static int h; 
    private static int i; 
    private static int j; 
    private WifiManager wifiManager; 
    private String logTAG; 
    private int wifiState; 
    private boolean o; 

    class wifiControllerTask extends AsyncTask { 
     WifiAPController wifiAPControllerClass; 
     boolean a; 
     boolean b; 
     Context mContext; 

     public wifiControllerTask(WifiAPController wifiAPController, boolean arg3, boolean arg4, Context context) { 
      this.wifiAPControllerClass = wifiAPController; 
      this.a = arg3; 
      this.b = arg4; 
      this.mContext = context; 
     } 

     protected Void a(Void[] arg3) { 
      try { 
       WifiAPController.wifiToggle(this.wifiAPControllerClass, this.a); 
      } catch (Exception v0) { 
      } 
      return null; 
     } 

     public void a() { 
      int sdkCurrentVersion = 21; 
      try { 
       if (this.a) { 
        if (Build.VERSION.SDK_INT < sdkCurrentVersion) { 
         return; 
        } 

        this.wifiAPControllerClass.wifiToggle(this.mContext); 
        return; 
       } 

       if (Build.VERSION.SDK_INT < sdkCurrentVersion) { 
        return; 
       } 
      } catch (Exception v0) { 
       Log.e("noti error", v0.getMessage()); 
      } 
     } 

     protected void a(Void arg2) { 
      super.onPostExecute(arg2); 
      try { 
       this.a(); 
      } catch (IllegalArgumentException v0) { 
       try { 
        this.a(); 
       } catch (Exception v0_1) { 
       } 
      } 

      if (this.b) { 
       this.wifiAPControllerClass.finish(); 
      } 
     } 

     protected Object doInBackground(Object[] arg2) { 
      return this.a(((Void[]) arg2)); 
     } 

     protected void onPostExecute(Object arg1) { 
      this.a(((Void) arg1)); 
     } 

     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 
    } 


    static { 
     WifiAPController.g = 0; 
     WifiAPController.h = 0; 
     WifiAPController.i = 1; 
     WifiAPController.j = 4; 
    } 

    public WifiAPController() { 
     super(); 
     this.a = 2; 
     this.b = 3; 
     this.logTAG = "WifiAP"; 
     this.wifiState = -1; 
     this.o = false; 
    } 

    static int wifiToggle(WifiAPController wifiAPController, boolean wifiToggleFlag) { 
     return wifiAPController.wifiToggle(wifiToggleFlag); 
    } 

    private void initWifiAPConfig(WifiConfiguration wifiConfiguration){ 
     wifiConfiguration.SSID = "SomeName"; 
     wifiConfiguration.preSharedKey = "SomeKey1"; 
     wifiConfiguration.hiddenSSID = false; 
     wifiConfiguration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
     wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
     wifiConfiguration.allowedKeyManagement.set(4); 
     wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
     wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
    } 

    private int wifiToggle(boolean wifiToggleFlag) { 
     int wifiState; 
     String stateString; 
     StringBuilder message; 
     long sleepTimeout = 500; 
     int maxAttemptCount = 10; 
     int errorState = -1; 
     Log.d(this.logTAG, "*** setWifiApEnabled CALLED **** " + wifiToggleFlag); 
     WifiConfiguration wifiConfiguration = new WifiConfiguration(); 
     initWifiAPConfig(wifiConfiguration); 
     if ((wifiToggleFlag) && this.wifiState == errorState) { 
      this.wifiState = this.wifiManager.getWifiState(); 
     } 

     if (!(!wifiToggleFlag || this.wifiManager.getConnectionInfo() == null)) { 
      Log.d(this.logTAG, "disable wifi: calling"); 
      this.wifiManager.setWifiEnabled(false); 
      int attemptCount = maxAttemptCount; 
      while (attemptCount > 0) { 
       if (this.wifiManager.getWifiState() == 1) { 
        break; 
       } 

       Log.d(this.logTAG, "disable wifi: waiting, pass: " + (10 - attemptCount)); 
       try { 
        Thread.sleep(sleepTimeout); 
        --attemptCount; 
       } catch (Exception v4_1) { 
       } 
      } 

      Log.d(this.logTAG, "disable wifi: done, pass: " + (10 - attemptCount)); 
     } 

     try { 
      message = new StringBuilder(); 
      stateString = wifiToggleFlag ? "enabling" : "disabling"; 
      Log.d(this.logTAG, message.append(stateString).append(" wifi ap: calling").toString()); 
      Log.d(this.logTAG, this.APname); 
      Log.d(this.logTAG, this.password); 
      Log.d(this.logTAG, "" + this.wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class).invoke(this.wifiManager, wifiConfiguration, true).toString()); 
      int res = this.wifiManager.addNetwork(wifiConfiguration); 
      Log.d(this.logTAG, "" + res); 
      wifiState = (int) this.wifiManager.getClass().getMethod("getWifiApState").invoke(this.wifiManager); 
      Log.d(this.logTAG, "" + wifiState); 
     } catch (Exception v0_1) { 
      Log.e("wifi", v0_1.getMessage()); 
      wifiState = errorState; 
     } 

     while (maxAttemptCount > 0) { 
      if (this.wifiToggle() != WifiAPController.h && this.wifiToggle() != this.b && this.wifiToggle() != WifiAPController.j) { 
       break; 
      } 
      message = new StringBuilder(); 
      stateString = wifiToggleFlag ? "enabling" : "disabling"; 
      Log.d(this.logTAG, message.append(stateString).append(" wifi ap: waiting, pass: ").append(10 - maxAttemptCount).toString()); 
      sleepTimeout = 500; 
      try { 
       Thread.sleep(sleepTimeout); 
       --maxAttemptCount; 
      } catch (Exception v0_1) { 
      } 
     } 
     message = new StringBuilder(); 
     stateString = wifiToggleFlag ? "enabling" : "disabling"; 
     Log.d(this.logTAG, message.append(stateString).append(" wifi ap: done, pass: ").append(10 - maxAttemptCount).toString()); 

     if (!wifiToggleFlag) { 
      if ((this.wifiState >= WifiManager.WIFI_STATE_ENABLING && this.wifiState <= WifiManager.WIFI_STATE_UNKNOWN) || (this.o)) { 
       Log.d(this.logTAG, "enable wifi: calling"); 
       this.wifiManager.setWifiEnabled(true); 
      } 

      this.wifiState = errorState; 
      return wifiState; 
     } 
     return wifiState; 
    } 

    public int wifiToggle() { 
     int result; 
     int v4 = 10; 
     try { 
      result = (int) this.wifiManager.getClass().getMethod("getWifiApState").invoke(this.wifiManager); 
     } catch (Exception v0) { 
      result = -1; 
     } 

     if (result >= v4) { 
      WifiAPController.g = v4; 
     } 

     WifiAPController.h = WifiAPController.g; 
     WifiAPController.i = WifiAPController.g + 1; 
     this.a = WifiAPController.g + 2; 
     this.b = WifiAPController.g + 3; 
     WifiAPController.j = WifiAPController.g + 4; 
     return result; 
    } 

    public void wifiToggle(Context context) { 
     Intent v0 = new Intent(context, MainActivity.class); 
    } 

    public void wifiToggle(String apname, String pass, WifiManager wifiManager, Context context) { 
     boolean v2 = true; 
     if (this.wifiManager == null) { 
      this.wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
     } 

     this.APname = apname; 
     this.password = pass; 
     int v0 = this.wifiToggle() == this.b || this.wifiToggle() == this.a ? 1 : 0; 
     if (v0 != 0) { 
      v2 = false; 
     } 

     new wifiControllerTask(this, v2, false, context).execute(new Void[0]); 
    } 
} 

Ngoài ra, trong Hoạt động chính bạn nên gọi như thế này:

WifiAPController wifiAPController = new WifiAPController(); 
    wifiAPController.wifiToggle("mHotspot", "12345678", wifiManager, context); 

Đừng quên về quyền truy cập:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<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" /> 

Tôi đã thử nghiệm điều này trên Nexus 6 với Marshmallow (6.0)

+0

Tôi xin lỗi tôi mất quá nhiều thời gian để trả lời ... Tôi cố gắng sử dụng mã của bạn nhưng tôi là người mới bắt đầu và không thể đáp ứng yêu cầu cho các đối số trong wifiAPController.wifiToggle ... Bạn có thể trợ giúp với wifiManager và bối cảnh? Trợ giúp của bạn được đánh giá cao! – user2826067

+0

Ngữ cảnh bối cảnh = getApplicationContext(); WifiManager wifiManager = (WifiManager) ngữ cảnh .getSystemService (Context.WIFI_SERVICE); –

+0

nó không hoạt động với tôi –

0

Bất kỳ ai cũng thử?

http://www.ibtimes.co.uk/how-enable-tethering-android-6-0-marshmallow-update-1524792

Nó về cơ bản nói rằng bạn chạy một adb shell và làm điều này:

thiết lập đặt toàn cầu tether_dun_required 0

Bây giờ rõ ràng đây không phải là một cái gì đó một ứng dụng có thể làm, nhưng tôi chỉ muốn chương trình android của tôi để bật và tắt tethering theo chương trình cho tôi trên điện thoại của tôi, vì vậy nếu nó hoạt động cho tôi, tôi sẽ rất vui. Nghe có vẻ như, giống như nó chỉ loại bỏ sự kiểm soát của người vận chuyển, không chắc chắn nó được xung quanh bất kỳ hạn chế mới marshmallow chính nó đã gây ra cho chúng tôi phát triển không may.

Các vấn đề liên quan