如何使用 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)来执行此类操作。
我需要使用自定义 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)来执行此类操作。