Обновить

Комментарии 6

Эээ, как то я не проникся темой. Почему просто не сделать вот так?

Samsung s24fe

Потому что на последних адройд версиях это залочено для управления и без рута доступа нн получить, а напртмер на Honor вообще сейчас рут не получить.

А родной программы для этого нет? Я не пользовался Xiaomi уже пару поколений, но вроде что-то подобное там было, не?

Нету, механика прямого доступа управления точкой доступа залочена с определенных версий андройда.

Что "это"?

На 8.5, указанный выше сценарий работает без рута.

Что-то тут дофига геморроя и весь он нужен ТОЛЬКО для плей стора.
Если решать задачу "для себя", как описано в истории с плеером из машины, то сам хотспот поднять вообще несложно и вот это ВСЕ права, которые надо запросить по части WiFi:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />

В .NET Android есть формат вызова нативных "скрытых" java функций самой ОС Андроид.

Для любой версии 13+ я писал когда-то для себя вот такое (При этом эта функция мне нужна была не просто, чтобы хотспот поднять, а чтобы поднять его с КОНКРЕТНЫМ SSID и паролем, что так-то считается сейчас супер-небезопасным и поэтому нужны скрытые API)

public void StartHotspot()
    {
        var wifiManager = (WifiManager)main.GetSystemService(Context.WifiService);
        if (wifiManager is null) return;
        try
        {
            var builderClass = Java.Lang.Class.ForName("android.net.wifi.SoftApConfiguration$Builder");
            var configClass = Java.Lang.Class.ForName("android.net.wifi.SoftApConfiguration");
            var builderInstance = builderClass.GetConstructor().NewInstance();

            //Установка названия сети (у меня глобальная переменная ssid)
            Method setSsidMethod = builderClass.GetMethod("setSsid", Java.Lang.Class.FromType(typeof(Java.Lang.String)));
            setSsidMethod.Invoke(builderInstance, new Java.Lang.String(ssid));

           //Установка пароля (у меня глобальная переменная password)
           Method setPassphraseMethod = builderClass.GetMethod("setPassphrase", 
                Java.Lang.Class.FromType(typeof(Java.Lang.String)), 
                Java.Lang.Integer.Type);
            setPassphraseMethod.Invoke(builderInstance, new Java.Lang.String(password), 1);
            Method setBandMethod = builderClass.GetMethod("setBand", Java.Lang.Integer.Type);
            setBandMethod.Invoke(builderInstance, 1); 

           
            Method buildMethod = builderClass.GetMethod("build");
            var customConfig = buildMethod.Invoke(builderInstance);

            // Вызов скрытой WifiManager.startLocalOnlyHotspot(config, executor, callback)
             var handler = new CustomHotspotCallback(this);
            var mainExecutor = ContextCompat.GetMainExecutor(main);
            var callbackClass = Java.Lang.Class.ForName("android.net.wifi.WifiManager$LocalOnlyHotspotCallback");
            Method startHotspotMethod = wifiManager.Class.GetMethod("startLocalOnlyHotspot", 
                configClass, 
                Java.Lang.Class.FromType(typeof(Java.Util.Concurrent.IExecutor)), 
                callbackClass);

            Java.Lang.Object[] methodArgs = new Java.Lang.Object[] 
            { 
                (Java.Lang.Object)customConfig, 
                (Java.Lang.Object)mainExecutor, 
                handler 
            };
            startHotspotMethod.Invoke(wifiManager, methodArgs);
      
        }
        catch (System.Exception ex)
        {
            System.Diagnostics.Debug.WriteLine($"Ошибка запуска спота: {ex.Message}");
        }
    }

Насколько помню, работало простой установкой через ADB без каких-либо рутовых прав

P.S. На новых версия андроида (16+) будет создавать стандартную точку с генерацией SSID и пароля, даже если указать их кастомно, но в сценарии автора и это подходит

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации