如何使用 ConnectivityManager 通过自定义(ssid 和密码)配置启动 wifi 热点?

How to start wifi hotspot with custom (ssid and password )configuration using ConnectivityManager?

我需要使用自定义 ssid 和密码创建一个 wifi 接入点。我在网上看了看,大多数答案都是通过反射使用 WifiManger#setWifiApEnabled 的。但是当我检查 source 时,它说 api 已被弃用,并且在方法内部它不会启动 Access point 只是给出警告日志。

 @SystemApi
    @Deprecated
    @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
    public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
        String packageName = mContext.getOpPackageName();

        Log.w(TAG, packageName + " attempted call to setWifiApEnabled: enabled = " + enabled);
        return false;
    }

在方法的描述中,它说使用 ConnectivityManager#startTethering。看起来它可以启动接入点,但我看不到我应该在哪里提供我的 WiFi 配置,因为 class 适用于多种(蓝牙、lte 等)连接类型。

 @SystemApi
    @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
    public void startTethering(int type, boolean showProvisioningUi,
            final OnStartTetheringCallback callback, Handler handler) {
        Preconditions.checkNotNull(callback, "OnStartTetheringCallback cannot be null.");

        ResultReceiver wrappedCallback = new ResultReceiver(handler) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                if (resultCode == TETHER_ERROR_NO_ERROR) {
                    callback.onTetheringStarted();
                } else {
                    callback.onTetheringFailed();
                }
            }
        };

        try {
            String pkgName = mContext.getOpPackageName();
            Log.i(TAG, "startTethering caller:" + pkgName);
            mService.startTethering(type, wrappedCallback, showProvisioningUi, pkgName);
        } catch (RemoteException e) {
            Log.e(TAG, "Exception trying to start tethering.", e);
            wrappedCallback.send(TETHER_ERROR_SERVICE_UNAVAIL, null);
        }
    }

我还希望我的应用支持最小 api 16(软糖)和最大奥利奥。 或者我应该强制用户设置 Wifi 网络?

我认为无法在 oreo 或更高版本上启动自定义 wifi 热点。有一个名为 ShareIt 的文件传输应用程序,它在接收模式下启动自定义 wifi 热点。如果在 oreo 上 运行,它会创建一个名称通常为 Android-blah 的热点和一个随机密码,并要求发件人手动输入该密码以发送该文件。可能 android 是 forcing/suggesting 其开发人员使用其他无线技术(如 Wifi direct)来执行此类操作。