0

I need to turn on a device hotspot from inside an app. To do so, I have used WifiManager.LocalOnlyHotspotCallback (see detail here)

On android 8, it first shows a dialog box as "the app has stopped", and after clicking close app, the page setting/general management is shown for a second. However, on android 12, it never shows any thing and is closed automatically.

Does anyone know how I can get it running (either on android 8 or 12)? Thanks in advance. Here is my code in MainActivity.java:

package io.ionic.starter;
import android.Manifest;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler; 
import androidx.core.app.ActivityCompat;
import com.getcapacitor.BridgeActivity;

public class MainActivity extends BridgeActivity {
  public static int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
  private WifiManager wifiManager;
  private WifiManager.LocalOnlyHotspotReservation hotspotReservation;

  @Override
  public void onStart() { 
    super.onStart();
    turnOnHotspot();
  }
  private void turnOnHotspot() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
      requestPermissions( new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
      MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
    }
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      // TODO: Consider calling
      //    ActivityCompat#requestPermissions
      // here to request the missing permissions, and then overriding
      //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
      //                                          int[] grantResults)
      // to handle the case where the user grants the permission. See the documentation
      // for ActivityCompat#requestPermissions for more details.

      return;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      wifiManager.startLocalOnlyHotspot(new
        WifiManager.LocalOnlyHotspotCallback() {
        @Override
        public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
          super.onStarted(reservation);
          hotspotReservation = reservation;
          String key = hotspotReservation.getWifiConfiguration().preSharedKey;
          String ussid = hotspotReservation.getWifiConfiguration().SSID;
          System.out.println("KEY: " + key);
          System.out.println("USSID: " + ussid);
          System.out.println("STARTED THE HOTSPOT");
        }

        @Override
        public void onStopped() {
          super.onStopped();
          System.out.println("STOPPED THE HOTSPOT");
        }

        @Override
        public void onFailed(int reason) {
          super.onFailed(reason);
          System.out.println("FAILED THE HOTSPOT");
        }
        }, new Handler());
    }
  }  
}
ugexe
  • 5,297
  • 1
  • 28
  • 49
user6781
  • 25
  • 4

1 Answers1

0

Looking into the logcat I realized I am getting an error which says:

LocalOnlyHotspotCallback() is called by a null object.

Which means WifiManager is not defined correctly! Thanks to this answer I could solve the problem by defining the object like this:

WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

So here is the whole code that works on android 8:

package io.ionic.starter;    
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler; 
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;    
import com.getcapacitor.BridgeActivity;

public class MainActivity extends BridgeActivity {
  private WifiManager.LocalOnlyHotspotReservation mReservation;
  @Override
  public void onStart() { 
    super.onStart();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       turnOnHotspot();
    }
  }

  @RequiresApi(api = Build.VERSION_CODES.O)
  private void turnOnHotspot() {
    WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      // TODO: Consider calling
      //    ActivityCompat#requestPermissions
      // here to request the missing permissions, and then overriding
      //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
      //                                          int[] grantResults)
      // to handle the case where the user grants the permission. See the documentation
      // for ActivityCompat#requestPermissions for more details.
      return;
    }
    manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {

      @Override
      public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
        super.onStarted(reservation);
        mReservation = reservation;
      }

      @Override
      public void onStopped() {
        super.onStopped();    
      }

      @Override
      public void onFailed(int reason) {
        super.onFailed(reason);    
      }
    }, new Handler());
  }

  private void turnOffHotspot() {
    if (mReservation != null) {
      mReservation.close();
    }
  }
}
user6781
  • 25
  • 4