Esta pregunta ya ha sido formulada por muchas personas, pero la solución que funcionó para ellos no funciona para mí. He probado en Android 8.1 y Android 9.0 y no puedo obtener el nombre del SSID.
Receptor de difusión para obtener cambios de estado de WiFi:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION) ||
intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION) ||
intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION) ||
intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
setWifiIndicator();
}
}
};
El receptor está registrado onCreate
y no registrado onDestroy
, lo que creo que es correcto, y estoy viendo las líneas de registro cuando se llama al receptor.
en onCreate
:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ScannerService.ACTION_READ_SCANNER);
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
registerReceiver(mReceiver, intentFilter);
setWifiIndicator();
setWifiIndicator
se implementa así:
private void setWifiIndicator() {
ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//getApplicationContext solves memory leak issues prior to Android N (must use Application Context to get wifi system service.
WifiManager wifiMgr = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
ImageView wifiIndicator = (ImageView)findViewById(R.id.wifi_indicator);
TextView wifiSSID = (TextView)findViewById(R.id.wifi_ssid);
try {
if (wifiMgr != null) {
if (wifiMgr.isWifiEnabled()) {
//wifi is enabled. toggle on wifi indicator.
wifiIndicator.setImageResource(R.drawable.wifi_indicator);
String ssid = wifiMgr.getConnectionInfo().getSSID();
if (ssid != null) {
Log.v(this.getClass().getSimpleName(), "SSID: " + ssid + " Supplicant State: " + info.getSupplicantState());
wifiSSID.setText(ssid);
}
} else {
//wifi is disabled. toggle off wifi indicator.
wifiSSID.setText("");
//check for 3G
NetworkInfo mobileInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mobileInfo != null && mobileInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
wifiIndicator.setImageResource(R.drawable.cellular_indicator);
} else {
wifiIndicator.setImageResource(R.drawable.down_indicator);
}
}
} else {
//check for 3G
NetworkInfo mobileInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mobileInfo != null && mobileInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
wifiIndicator.setImageResource(R.drawable.cellular_indicator);
} else {
wifiIndicator.setImageResource(R.drawable.down_indicator);
}
}
} catch(Exception e) {
//catching anything thrown in this block just so it doesn't crash the program unnecessarily
e.printStackTrace();
}
}
Mi aplicación ya tenía permiso ACCESS_COARSE_LOCATION
pero también agregué por ACCESS_FINE_LOCATION
si acaso. getSSID()
es hasta que regrese <unknown ssid>
.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
Quizás tiene que ver con compilar SDK de destino? Estoy realmente despistado aquí.
archivo gradle:
aplique el complemento: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.noneofyour.business"
minSdkVersion 15
targetSdkVersion 28
versionCode 59
versionName "1.44"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/android.jar')
}
¿Has intentado comprobar si getSupplicantState()
es así COMPLETED
?
if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED){
String ssid = wifiInfo.getSSID();
wifiSSID.setText(ssid);
}
Además, ¿ha pedido esto antes de ejecutarlo BroadcastReceiver
o incluso dentro puede hacerlo:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);
}else{setWifiIndicator();
En los casos en que el usuario haya cerrado el navegador y se haya marchado, quiero iniciar sesión cuando se agote el tiempo de espera de la sesión. Por ejemplo, como cierre de sesión inducido por el sistema en lugar de solicitud del usuario (ya tengo trabajo y ...
Estoy escribiendo un juego pequeño y necesito leer el archivo de texto, escribirlo en una matriz y luego imprimir la matriz. Mi clase para leer y devolver una matriz se ve así: import java.io. *; import java.util. *; ...
Estoy desarrollando un API REST pero me enfrenté al siguiente problema: en algunos casos, la identificación de mis recursos son URL. La API se utiliza para ambos, un software donde las ID están en formato UUID y un FileSystem ...
Estoy tratando de ejecutar el siguiente código. Pero cada vez que ejecuto se abre una nueva ventana de Chrome. Cómo arreglar este problema. Además, la nueva instancia de Chrome que se abre no está conectada, por lo que no puedo usar la extensión ...