使用 Xamarin Forms 在 Android 10+ 中启动热点

问题描述

希望你能帮忙,我已经尝试了一切来让它工作。我试图改编其他显然在 android studio 中工作的代码,以便在 Xamarin 中工作。我已经到了无法通过的地步。这是我所拥有的...

理想情况下,我需要从 OnStartTetheringCallback 类创建代理,如 android studio 示例 (https://stackoverflow.com/a/52219887) 中所示,但该库似乎不适用于 xamarin。请帮忙!

public bool EnableTethering()
    {

        try
        {

            var context = Android.App.Application.Context;
            ConnectivityManager manager = ConnectivityManager.FromContext(context);

            var methods = manager.Class.GetDeclaredMethods()
                .Select(m => new keyvaluePair<java.lang.Reflect.Method,java.lang.class[]>(m,m.GetParameterTypes()));
            var callbackClass = manager.Class.GetDeclaredClasses().First(c => c.Name == "android.net.ConnectivityManager$OnStartTetheringCallback");
            var method = methods.First(m => m.Key.Name == "startTethering").Key; //manager.Class.GetDeclaredMethod("startTethering");//,new java.lang.class[] { classFromType<int>(),classFromType<bool>(),classOnStartTetheringCallback(),classFromType<Handler>() } );


            if (method == null)
            {
            }
            else
            { 
                method.Invoke(manager,new java.lang.Object[] { 0,false,callbackClass });

            }
            return true;
        }
        catch (Exception e)
        {
        }
        return false;
    }

===================================================================================================
{java.lang.IllegalArgumentException: method android.net.ConnectivityManager.startTethering
argument 3 has type android.net.ConnectivityManager$OnStartTetheringCallback,got java.lang.class<android.net.ConnectivityManager$OnStartTetheringCallback>
  at Java.Interop.jnienvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance,Java.Interop.JniMethodInfo method,Java.Interop.JniArgumentValue* args) [0x0006e] in <8b3b636835d84984ba4604c1f57b1983>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractObjectMethod (System.String encodedMember,Java.Interop.IJavaPeerable self,Java.Interop.JniArgumentValue* parameters) [0x00014] in <8b3b636835d84984ba4604c1f57b1983>:0 
  at java.lang.Reflect.Method.Invoke (java.lang.Object obj,java.lang.Object[] args) [0x0004b] in <84ca7e914f6148f0b961431a9ac4287b>:0 
  at Millsnet.SpotUp.Services.WifiService.EnableTethering () [0x000af] in C:\Users\djmil\source\repos\Millsnet.SpotUp\Millsnet.SpotUp\Millsnet.SpotUp\Services\WifiService.cs:149 
  --- End of managed java.lang.IllegalArgumentException stack trace ---
java.lang.IllegalArgumentException: method android.net.ConnectivityManager.startTethering argument 3 has type android.net.ConnectivityManager$OnStartTetheringCallback,got java.lang.class<android.net.ConnectivityManager$OnStartTetheringCallback>
    at java.lang.reflect.Method.invoke(Native Method)
    at mono.java.lang.RunnableImplementor.n_run(Native Method)
    at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7711)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
}
===========================================================================================

解决方法

我设法解决了这个问题。

我编译了一个 LindeIn/DexMaker 的 xamarin 库,所以现在我可以使用代理制造商了。 https://github.com/djmillsuk/LinkedIn-DexMaker-Xamarin

然后我将目标定位为 android 11,因为 starttethering 在 android 10 上不起作用。

它现在运行良好。