WiFi getSSID () siempre devuelve "<ssid desconocido>"

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 onCreatey 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_LOCATIONpero también agregué por ACCESS_FINE_LOCATIONsi 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')
}
Respuesta 1

¿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 BroadcastReceivero 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(); 
Respuesta: 2

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 ...