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

时间:2018-03-17 06:46:59

标签: android android-wifi hotspot

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

 @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。看起来它可以启动Access Point,但我无法看到我应该在哪里提供我的WiFi配置,因为该类适用于多种(蓝牙,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);
        }
    }

此外,我希望我的应用程序支持min api 16(软糖)和最大的oreo。 或者我应该强迫用户设置Wifi网络?

1 个答案:

答案 0 :(得分:1)

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