So überprüfen Sie, ob Google Glass über GDK mit dem Internet verbunden ist

Kann ich zur Laufzeit feststellen, ob Google Glass mit dem Internet verbunden ist? Beispielsweise erhalte ich häufig die Meldung "Google kann zurzeit nicht erreicht werden", wenn ich in meiner App Spracheingaben verwende. Stattdessen möchte ich die Bedingung, die diese Nachricht verursacht, präventiv abfangen und Standardwerte verwenden, anstatt nach Spracheingabe zu fragen. Nachdem ich eine Weile gesucht hatte, war das Einzige, was ich finden konnte, eine Lösung für die gleiche Frage für Android im Allgemeinen:

private boolean isConnected() {
    ConnectivityManager connectivityManager
            = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Ich habe versucht, dies für meine Glaswaren zu verwenden, aber es scheint nicht zu funktionieren (ich habe das WLAN und die Daten deaktiviert, aber isConnected () gibt weiterhin true zurück, obwohl die Meldung "Google kann jetzt nicht erreicht werden" angezeigt wird). Weiß jemand, ob die GDK einen Weg dazu hat? Oder sollte etwas ähnliches wie die obige Methode funktionieren?

EDIT: Hier ist meine endgültige Lösung, die teilweise auf der Antwort von EntryLevelDev basiert.

Ich musste einen Hintergrund-Thread verwenden, um HTTP-GET-Anforderungen zu verwenden, um zu vermeiden, dass eine NetworkOnMainThreadException abgerufen wird. Daher habe ich beschlossen, diese alle paar Sekunden auszuführen und eine lokale isConnected-Variable zu aktualisieren:

public static boolean isConnected = false;

public boolean isDeviceConnectedToInternet() {
    return isConnected;
}

private class CheckConnectivityTask extends AsyncTask<Void, Boolean, Boolean> {
    protected Boolean doInBackground(Void... voids) {
        while(true) {
            // Update isConnected variable.
            publishProgress(isConnected());
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Determines if the Glassware can access the internet.
     * isNetworkAvailable() is used first because there is no point in executing an HTTP GET
     * request if ConnectivityManager and NetworkInfo tell us that no network is available.
     */
    private boolean isConnected(){
        if (isNetworkAvailable()) {
            HttpGet httpGet = new HttpGet("http://www.google.com");
            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
            HttpConnectionParams.setSoTimeout(httpParameters, 5000);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            try{
                Log.d(LOG_TAG, "Checking network connection...");
                httpClient.execute(httpGet);
                Log.d(LOG_TAG, "Connection OK");
                return true;
            }
            catch(ClientProtocolException e){
                e.printStackTrace();
            }
            catch(IOException e){
                e.printStackTrace();
            }
            Log.d(LOG_TAG, "Connection unavailable");
        } else {
            // No connection; for Glass this probably means Bluetooth is disconnected.
            Log.d(LOG_TAG, "No network available!");
        }
        return false;
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager
                = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        Log.d(LOG_TAG, String.format("In isConnected(), activeNetworkInfo.toString(): %s",
                activeNetworkInfo == null ? "null" : activeNetworkInfo.toString()));
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    protected void onProgressUpdate(Boolean... isConnected) {
        DecisionMakerService.isConnected = isConnected[0];
        Log.d(LOG_TAG, "Checking connection: connected = " + isConnected[0]);
    }
}

Rufen Sie an, um es zu startennew CheckConnectivityTask().execute(); (wahrscheinlich von onCreate ()). Ich musste diese auch zu meinem Android.manifest hinzufügen:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

Antworten auf die Frage(2)

Ihre Antwort auf die Frage