Проблемы с IntelliJ IDEA — несовместимые типы

#android

#Android

Вопрос:

Когда я пытаюсь LocationProvider locationProvider = LocationManager.GPS_PROVIDER; IntelliJ выдает мне ошибку: incompatible types: required: android.location.LocationProvider found: java.lang.String.

Что дает?

Ответ №1:

У меня есть проект, встроенный в IDEA, и у меня не было этой проблемы. Вы проверили, что импортируете все соответствующие пакеты?

 import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.GpsStatus;
  

Когда вы щелкаете правой кнопкой мыши / переходите к / Объявлению LocationManager, вы должны увидеть следующий код:

 package android.location;

public class LocationManager  {
    public static final java.lang.String NETWORK_PROVIDER = "network";
    public static final java.lang.String GPS_PROVIDER = "gps";
  

Обновить

ОК. Я знаю, что здесь происходит. То, что вы делаете, — это назначение LocationManager.GPS_PROVIDER (который на самом деле является строкой) к объекту LocationProvider. отсюда ошибка несовместимых типов.

Есть ли причина, по которой вы хотите создать экземпляр объекта LocationProvider? Глядя на API LocationManager, вам на самом деле не нужен ни один из них. API принимает постоянные строки (GPS_PROVIDER, NETWORK_PROVIDER и т.д.) И Создает экземпляр соответствующего LocationProvider внутри. Если вам действительно нужен экземпляр LocationProvider, вы можете получить его обратно из LocationManager с помощью метода getProvider.

Еще одно обновление

Итак, похоже, что причина, по которой OP столкнулся с этой проблемой в первую очередь, заключается в том, что пример кода в документации по получению местоположения пользователя просто неверен:

 LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// Or use LocationManager.GPS_PROVIDER

Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
  

LocationProvider — это абстрактный суперкласс, и вы не должны создавать экземпляры этих вещей напрямую. Вместо этого вы передаете LocationManager.type_of_provider_here в LocationManager, и он создает экземпляр объекта, который реализует этот абстрактный класс. Итак, образец должен быть:

 Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
  

Комментарии:

1. У меня есть everything import android.location.*;

2. @LuxuryMode Ок. Очевидно, что это не так. Я возился со своим проектом, чтобы посмотреть, смогу ли я воспроизвести проблему, а затем работать в обратном направлении. Я дам вам знать, как я поступлю.

3. @LuxuryMode Что происходит, когда вы переходите к объявлению в LocationManager? (смотрите Мое обновление).

4. Я просто следовал вместе с d.android.com/guide/topics/location/… Пример показывает: LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;

5. @LuxuryMode Это просто кажется мне неправильным. Сделайте это вместо этого (еще раз взглянув на документ LocationProvider, чтобы увидеть, есть ли конструктор, который принимает LocationManager. <ТИП>): LocationManager.requestLocationUpdates(LocationManager. NETWORK_PROVIDER, 0, 0, LocationListener);