Есть ли способ определить, подключены ли Google Glass к Интернету во время работы? Например, я часто получаю сообщение «Не удается связаться с Google прямо сейчас» при использовании голосового ввода в моем приложении. Вместо этого я хотел бы предварительно перехватить условие, которое вызовет это сообщение, и использовать значения по умолчанию, а не запрашивать голосовой ввод. После некоторого поиска единственное, что я смог найти, это решение того же вопроса для Android в целом:
private boolean isConnected() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Я пытался использовать это для своего Glassware, но, похоже, это не работает (я отключил Wi-Fi и передачу данных, но isConnected() по-прежнему возвращает значение true, хотя я получаю сообщение «Не удается связаться с Google прямо сейчас»). Кто-нибудь знает, есть ли у GDK способ сделать это? Или должно работать что-то похожее на описанный выше метод?
EDIT: вот мое окончательное решение, частично основанное на ответе EntryLevelDev ниже.
Мне пришлось использовать фоновый поток для использования запросов HTTP GET, чтобы избежать исключения NetworkOnMainThreadException, поэтому я решил запускать его каждые несколько секунд и обновлять локальную переменную isConnected:
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]);
}
}
Чтобы запустить его, вызовите new CheckConnectivityTask().execute();
(вероятно, из onCreate()). Мне также пришлось добавить их в свой Android.manifest:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />