In my Android application I'm using the following code snippet:
在我的Android应用程序中,我使用以下代码片段:
@RequiresApi(api = Build.VERSION_CODES.O)
private void turnOnHotspot(){
WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback(){
@Override
public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
super.onStarted(reservation);
Log.d(TAG, "Wifi Hotspot is on now");
}
@Override
public void onStopped() {
super.onStopped();
Log.d(TAG, "onStopped: ");
}
@Override
public void onFailed(int reason) {
super.onFailed(reason);
Log.d(TAG, "onFailed: ");
}
},new Handler());
}
This piece of code creates a hotspot named something like "AndroidShare_1234". For a project of mine I need to be able to set a password and SSID to this hotspot, however I can't find a way to do this. I would like to create a hotspot with an SSID like MyHotspot
and a custom password.
这段代码创建了一个名为“AndroidShare_1234”的热点。对于我的项目,我需要能够为此热点设置密码和SSID,但是我找不到这样做的方法。我想创建一个像MyHotspot这样的SSID和自定义密码的热点。
Note that the setWifiApEnabled
is not supported anymore in Android O, this is how it's done in older versions of Android. However, I still need to programmatically make a wifi hotspot with a SSID and a password. I can't figure out how to do this. Thanks in advance!
请注意,Android O中不再支持setWifiApEnabled,这是在旧版Android中完成的。但是,我仍然需要以编程方式使用SSID和密码创建一个wifi热点。我无法弄清楚如何做到这一点。提前致谢!
For who cares...:
谁关心...:
For a school project I made a locker that unlocks whenever it can connect to a wireless network with certain cridentials, hence the need of setting a hotspot programmatically.
对于一个学校项目,我制作了一个储物柜,只要它可以连接到具有某些警告的无线网络,就可以解锁,因此需要以编程方式设置热点。
1 个解决方案
#1
2
I have only a partial solution to the problem. Hopefully, it will be sufficient for the application you are designing.
我只能部分解决这个问题。希望它对您正在设计的应用程序足够了。
The SSID and the password are hard-coded by the android system when you start the Hotspot. By looking over at the AOSP code, I see that the same hotspot can be shared by multiple applications. The configuration for this hotspot(class name is WifiConfiguration
) is also shared with all the requesting applications. This configuration is passed back to the application in the callback onStarted(LocalOnlyHotspotReservation reservation)
. You can get the WifiConfiguration
by calling reservation.getWifiConfiguration()
. You will get all the information you need from the WifiConfiguration
object. So you can read the Pre-Shared Key and the access point name. But I don't think you can change them
FYI, The relevant code that sets up the wifi configuration (including the hard-coded SSID and WPA2-PSK key) is done by the following piece of code
启动Hotspot时,android系统会对SSID和密码进行硬编码。通过查看AOSP代码,我发现多个应用程序可以共享相同的热点。此热点的配置(类名称为WifiConfiguration)也与所有请求的应用程序共享。此配置将在回调onStarted(LocalOnlyHotspotReservation预留)中传递回应用程序。您可以通过调用reservation.getWifiConfiguration()来获取WifiConfiguration。您将从WifiConfiguration对象获得所需的所有信息。因此,您可以阅读预共享密钥和访问点名称。但我不认为你可以改变它们FYI,设置wifi配置的相关代码(包括硬编码的SSID和WPA2-PSK密钥)由以下代码完成
/**
* Generate a temporary WPA2 based configuration for use by the local only hotspot.
* This config is not persisted and will not be stored by the WifiApConfigStore.
*/
public static WifiConfiguration generateLocalOnlyHotspotConfig(Context context) {
WifiConfiguration config = new WifiConfiguration();
config.SSID = context.getResources().getString(
R.string.wifi_localhotspot_configure_ssid_default) + "_"
+ getRandomIntForDefaultSsid();
config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
config.networkId = WifiConfiguration.LOCAL_ONLY_NETWORK_ID;
String randomUUID = UUID.randomUUID().toString();
// first 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
config.preSharedKey = randomUUID.substring(0, 8) + randomUUID.substring(9, 13);
return config;
}
#1
2
I have only a partial solution to the problem. Hopefully, it will be sufficient for the application you are designing.
我只能部分解决这个问题。希望它对您正在设计的应用程序足够了。
The SSID and the password are hard-coded by the android system when you start the Hotspot. By looking over at the AOSP code, I see that the same hotspot can be shared by multiple applications. The configuration for this hotspot(class name is WifiConfiguration
) is also shared with all the requesting applications. This configuration is passed back to the application in the callback onStarted(LocalOnlyHotspotReservation reservation)
. You can get the WifiConfiguration
by calling reservation.getWifiConfiguration()
. You will get all the information you need from the WifiConfiguration
object. So you can read the Pre-Shared Key and the access point name. But I don't think you can change them
FYI, The relevant code that sets up the wifi configuration (including the hard-coded SSID and WPA2-PSK key) is done by the following piece of code
启动Hotspot时,android系统会对SSID和密码进行硬编码。通过查看AOSP代码,我发现多个应用程序可以共享相同的热点。此热点的配置(类名称为WifiConfiguration)也与所有请求的应用程序共享。此配置将在回调onStarted(LocalOnlyHotspotReservation预留)中传递回应用程序。您可以通过调用reservation.getWifiConfiguration()来获取WifiConfiguration。您将从WifiConfiguration对象获得所需的所有信息。因此,您可以阅读预共享密钥和访问点名称。但我不认为你可以改变它们FYI,设置wifi配置的相关代码(包括硬编码的SSID和WPA2-PSK密钥)由以下代码完成
/**
* Generate a temporary WPA2 based configuration for use by the local only hotspot.
* This config is not persisted and will not be stored by the WifiApConfigStore.
*/
public static WifiConfiguration generateLocalOnlyHotspotConfig(Context context) {
WifiConfiguration config = new WifiConfiguration();
config.SSID = context.getResources().getString(
R.string.wifi_localhotspot_configure_ssid_default) + "_"
+ getRandomIntForDefaultSsid();
config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
config.networkId = WifiConfiguration.LOCAL_ONLY_NETWORK_ID;
String randomUUID = UUID.randomUUID().toString();
// first 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
config.preSharedKey = randomUUID.substring(0, 8) + randomUUID.substring(9, 13);
return config;
}