이정원
이정원

Reputation: 55

How to use Wifimanager.LocalOnlyHotspotCallback in Xamarin.Forms

the environment is Xamarin.forms in android, but there are no Information about this.

how can i get WifiConfiguration from callback.onstarted ?

OR can i WifiManager.LocalOnlyHotspotReservation get value from callback.onstarted ?

please check below code, the code is about to using wifi AP over oreo version

when java code, i refer this article a link

    private WifiManager wifiManager;
    private WifiManager.LocalOnlyHotspotReservation reservation;
    void SetHotSpot()
    {
        wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService);

        WifiManager.LocalOnlyHotspotCallback callback = new WifiManager.LocalOnlyHotspotCallback();

        callback.OnStarted( reservation);                  
        wifiManager.StartLocalOnlyHotspot(callback, new Handler());
    }

    void getConfiguration(object sender, System.EventArgs e)
    {
        if (reservation != null)
        {
            Log.Debug("config", reservation.WifiConfiguration.Ssid);
            Log.Debug("config", reservation.WifiConfiguration.NetworkId.ToString());
            Log.Debug("config", reservation.WifiConfiguration.PreSharedKey);
            Log.Debug("config", reservation.WifiConfiguration.Bssid);
        }
    }

but when i click button, reservation is null. so Log Dose not output anything.

Upvotes: 1

Views: 2611

Answers (1)

FreakyAli
FreakyAli

Reputation: 16479

I converted the Java code here and came up with the following solution which seems to be working kindly take a look and let me know whether or not it works for you.

Add a Callback class that inherits from WifiManager.LocalOnlyHotspotCallback and pass the Activity in my case it is the MainActivity.

 public class OreoWifiManagerCallback : WifiManager.LocalOnlyHotspotCallback
{
    private const string TAG = nameof(OreoWifiManagerCallback);

    private MainActivity mainActivity;

    public OreoWifiManager(Activity _activity)
    {
        if (_activity.GetType() == typeof(MainActivity))
            mainActivity = (MainActivity)_activity;
    }

    public override void OnStarted(WifiManager.LocalOnlyHotspotReservation reservation)
    {
        base.OnStarted(reservation);
        Log.Debug(TAG, "Wifi Hotspot is on now");
        mainActivity.mReservation = reservation;
    }

    public override void OnFailed([GeneratedEnum] LocalOnlyHotspotCallbackErrorCode reason)
    {
        base.OnFailed(reason);
        Log.Debug(TAG, "onStopped: ");
    }

    public override void OnStopped()
    {
        base.OnStopped();
        Log.Debug(TAG, "onFailed: ");
    }
}

Then add a property in the MainActivity to keep track of the reservations

public WifiManager.LocalOnlyHotspotReservation mReservation { get; set; }

And then use these methods to turn on or off wifi in that Activity, also note that you can have a global field for wifi manager if needed.

 private void TurnOnHotspot()
    {
        var WifiManager = (WifiManager)this.Application.GetSystemService(Android.Content.Context.WifiService);
        WifiManager.StartLocalOnlyHotspot(new OreoWifiManagerCallback(this), new Handler());
    }

    private void TurnOffHotspot()
    {
        if (mReservation != null)
        {
            mReservation.Close();
        }
    }

Good luck

Feel free to revert at any time

Upvotes: 2

Related Questions