Trying to connect to a wifi I get ClassNotFoundException for WifiNetworkSpecifier$Builder

Jalza 781 Reputation points
2022-04-29T13:53:30.49+00:00

I need to connect a smartphone to specific WiFi network that is created by other device. I'm using Xamarin.Forms to develop my app. The goal is to connect the smartphone automatically, that is, programmatically. I just need to do Android development.

This is the connection code:

public class WifiConnector : IWifiConnector
{
    public void ConnectToWifi(string ssid, string password)
    {
        try
        {
            WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder();
            wifiNetworkSpecifierBuilder.SetSsid(ssid);
            wifiNetworkSpecifierBuilder.SetWpa2Passphrase(password);
            WifiNetworkSpecifier wifiNetworkSpecifier = wifiNetworkSpecifierBuilder.Build();

            NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
            networkRequestBuilder.AddTransportType(TransportType.Wifi);
            networkRequestBuilder.AddCapability(NetCapability.Internet);
            networkRequestBuilder.SetNetworkSpecifier(wifiNetworkSpecifier);
            NetworkRequest networkRequest = networkRequestBuilder.Build();

            ConnectivityManager connectivityManager = (ConnectivityManager)Android.App.Application.Context.GetSystemService(Context.ConnectivityService);
            connectivityManager.RequestNetwork(networkRequest, new NetworkCallback());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }
    }

    class NetworkCallback : ConnectivityManager.NetworkCallback
    {
        public override void OnAvailable(Network network)
        {
            base.OnAvailable(network);
            Log.Debug("WifiConnector", "OnAvailable(): " + network.ToString());
        }
    }
}

I don't have any compilation errors, but at runtime I get this error:

Didn't find class "android.net.wifi.WifiNetworkSpecifier$Builder" on path: DexPathList[[zip file "/data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/base.apk"],nativeLibraryDirectories=[/data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/lib/arm64, /data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
  at Java.Interop.JniEnvironment+Types.FindClass (System.String classname) [0x0015a] in <00c315a988634383b446eff646084784>:0 
  at Java.Interop.JniType..ctor (System.String classname) [0x00006] in <00c315a988634383b446eff646084784>:0 
  at Java.Interop.JniType.GetCachedJniType (Java.Interop.JniType& cachedType, System.String classname) [0x00018] in <00c315a988634383b446eff646084784>:0 
  at Java.Interop.JniPeerMembers.get_JniPeerType () [0x0000c] in <00c315a988634383b446eff646084784>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.get_JniPeerType () [0x00014] in <00c315a988634383b446eff646084784>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.StartCreateInstance (System.String constructorSignature, System.Type declaringType, Java.Interop.JniArgumentValue* parameters) [0x0003f] in <00c315a988634383b446eff646084784>:0 
  at Android.Net.Wifi.WifiNetworkSpecifier+Builder..ctor () [0x0001f] in /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Android.Net.Wifi.WifiNetworkSpecifier.cs:82 
  at ConnectToWifi.Droid.Services.WifiConnector.ConnectToWifi (System.String ssid, System.String password) [0x00002] in C:\DATA\Code tests\Xamarin\ConnectToWifi\ConnectToWifi\ConnectToWifi.Android\Services\WifiConnector.cs:27 
  --- End of managed Java.Lang.ClassNotFoundException stack trace ---
java.lang.ClassNotFoundException: Didn't find class "android.net.wifi.WifiNetworkSpecifier$Builder" on path: DexPathList[[zip file "/data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/base.apk"],nativeLibraryDirectories=[/data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/lib/arm64, /data/app/com.companyname.connecttowifi-i0OpZvWjDZqiRX01MQJcMA==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at crc64ee486da937c010f4.ButtonRenderer.n_onClick(Native Method)
    at crc64ee486da937c010f4.ButtonRenderer.onClick(ButtonRenderer.java:104)
    at android.view.View.performClick(View.java:7339)
    at android.widget.TextView.performClick(TextView.java:14275)
    at android.view.View.performClickInternal(View.java:7305)
    at android.view.View.access$3200(View.java:846)
    at android.view.View$PerformClick.run(View.java:27787)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7078)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

I added this permissions in AndroidManifest.xml file:

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

Details about project, libraries and development environment:

  • Microsoft Visual Studio Professional 2019 Version 16.11.12
  • Xamarin.Forms 5.0.0.2012
  • Android target version: Android 11 API 30
  • Smartphone Android version: Android 9 API 28

Why is this error happening?

Xamarin
Xamarin
A Microsoft open-source app platform for building Android and iOS apps with .NET and C#.
5,366 questions
0 comments No comments
{count} votes

Accepted answer
  1. Yonglun Liu (Shanghai Wicresoft Co,.Ltd.) 45,566 Reputation points Microsoft Vendor
    2022-05-02T05:45:36.513+00:00

    Hello,

    I noticed this in your issue:

    Android target version: Android 11 API 30

    Smartphone Android version: Android 9 API 28

    Referring to the Android official documentation WifiNetworkSpecifier, we can find it was added in API 29.

    Therefore, you will get ClassNotFoundException for WifiNetworkSpecifier$Builder in using API 28.

    If you want to implement this function in API 28, you could refer to WifiManager.

    You can use if(Build.VERSION.SdkInt >= BuildVersionCodes.Q) //use WifiNetworkSpecifier; else //use WifiManager to implement this function for both API 29 below or above.

    Best Regards,

    Alec Liu.


    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.