Android, NetworkInfo.getTypeName(), NullpointerException

У меня есть активность, которая показывает некоторые записи в списке. Когда я нажимаю элемент списка, мое приложение проверяет, какой тип соединения доступен ( "WIF" или "MOBILE" ), через NetworkInfo.getTypeName(). Как только я вызываю этот метод, я получаю исключение NullpointerException. Зачем?

Я тестировал это на эмуляторе, потому что мой телефон в настоящее время недоступен (он сломан...). Я предполагаю, что это проблема? Это единственное объяснение, которое у меня есть, если это не так, я не знаю, почему это было бы нулевым.

Вот фрагмент кода:

public class VideoList extends ListActivity{
 ...
 public void onCreate(Bundle bundle){
  final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  ...
  listview.setOnItemClickListener(new OnItemClickListener(){
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    ...
    NetworkInfo ni = cm.getActiveNetworkInfo();
    String connex = ni.getTypeName(); //Nullpointer exception here
    if(connex.equals("WIFI")doSomething();
   }
  });
 }
}

Ответ 1

Вызов getActiveNetworkInfo() может возвращать null, если нет активной сети, и вам нужно проверить это. Здесь исходный код здесь.

/**
 * Return NetworkInfo for the active (i.e., connected) network interface.
 * It is assumed that at most one network is active at a time. If more
 * than one is active, it is indeterminate which will be returned.
 * @return the info for the active network, or {@code null} if none is active
 */
public NetworkInfo getActiveNetworkInfo() {
    enforceAccessPermission();
    for (NetworkStateTracker t : mNetTrackers) {
        NetworkInfo info = t.getNetworkInfo();
        if (info.isConnected()) {
            return info;
        }
    }
    return null;
}

Обратите внимание, в частности, на javadoc: "вернуть информацию для активной сети, или null, если ни один не активен".

Ответ 2

Я понимаю, что у вас есть соединение, и эмулятор может его использовать, но тогда вызов getActiveNetworkInfo() возвращает вас в любом случае, и именно поэтому вы озадачены.

Ну, ваши подозрения были правильными: getActiveNetworkInfo() не работает на эмуляторе и всегда возвращает null.

Ответ 3

Я обнаружил, что если вы нажмете F8, чтобы включить 3G в эмуляторе, cm.getActiveNetworkInfo() затем вернет ненулевой полезный дескриптор NetworkInfo.

Ответ 4

Вместо

if(connex.equals("WIFI") doSomething();

попробовать

if("WIFI".equals(connex)) doSomething();