【问题标题】:How to use locationListener in android fragment如何在android片段中使用locationListener
【发布时间】:2017-09-13 10:48:25
【问题描述】:

我想在我的 android 片段中使用 locationListener。但我收到一个错误。我的代码在下面。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

        }
    };

    locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, locationListener);
    } 
    else {

    }
}

我收到此错误。

无法解析方法 requestLocationUpdates

【问题讨论】:

  • 你的 gradle 中有 compile 'com.google.android.gms:play-services-location:10.2.4' 吗?
  • 是.......................
  • 你能发布你的进口声明吗
  • 看我的回答,100%解决你的问题
  • 查看当前最佳实践:以 LocationListener developer.android.com/topic/libraries/architecture/… 为例

标签: android google-maps android-fragments


【解决方案1】:

实现LocationListener的所有方法

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            TextView textView = new TextView(getActivity());
            textView.setText(R.string.hello_blank_fragment);

            LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
            if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                if (new Utility().checkAndGrantPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, 101, "your custom message"))
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, locationListener);
            }

            return textView;
        }

onCreate

 LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
                  //Todo your code
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
                      //Todo your code
        }

        @Override
        public void onProviderEnabled(String provider) {
                      //Todo your code
        }

        @Override
        public void onProviderDisabled(String provider) {
                      //Todo your code
        }
    };

checkAndGrantPermission 方法是

public boolean checkAndGrantPermission(final Context context, final String permissionString, final int requestCode, String permissoinTypeMessage)
    {
        int currentAPIVersion = Build.VERSION.SDK_INT;
        if(currentAPIVersion>=android.os.Build.VERSION_CODES.M)
        {
            if (ContextCompat.checkSelfPermission(context, permissionString) != PackageManager.PERMISSION_GRANTED) {

                if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permissionString)) {
                    // your custom dialog screen when user deny permission
                } else {
                    ActivityCompat.requestPermissions((Activity) context, new String[]{permissionString}, requestCode);
                }
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

在活动覆盖onRequestPermissionsResult

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 101) {
            yourFragmentInstance.onRequestPermissionsResult(requestCode,permissions,grantResults);
        }
    }

在您的 Framgent 覆盖 onRequestPermissionsResult

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 101) {

            if (requestCode == AppConstants.runtimePermissionCode) {
                if (permissions[0].equals(Manifest.permission.ACCESS_FINE_LOCATION) && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, locationListener);
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    有你的问题。

    您使用了来自

    的位置监听器
    com.google.android.gms.location.LocationListener;
    

    你必须从

    导入 LocationListener
    android.location.Location;
    

    试试这个:

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, new android.location.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
    
                }
    
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {
    
                }
    
                @Override
                public void onProviderEnabled(String provider) {
    
                }
    
                @Override
                public void onProviderDisabled(String provider) {
    
                }
            });
    

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:

      创建这个类:

      public class GetCurrentLocation implements
                  ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
      
              private static final String TAG = "location-updates-sample";
              public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 0;
              public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
                      UPDATE_INTERVAL_IN_MILLISECONDS / 2;
              private final String REQUESTING_LOCATION_UPDATES_KEY = "requesting-location-updates-key";
              private final String LOCATION_KEY = "location-key";
              private final String LAST_UPDATED_TIME_STRING_KEY = "last-updated-time-string-key";
              private GoogleApiClient mGoogleApiClient;
              private LocationRequest mLocationRequest;
      
              private Context mContext;
              private getLocation mGetCurrentLocation;
      
              public GetCurrentLocation(Context context) {
                  mContext = context;
      
                  buildGoogleApiClient();
              }
      
              private synchronized void buildGoogleApiClient() {
                  Log.i(TAG, "Building GoogleApiClient");
                  mGoogleApiClient = new GoogleApiClient.Builder(mContext)
                          .addConnectionCallbacks(this)
                          .addOnConnectionFailedListener(this)
                          .addApi(LocationServices.API)
                          .build();
                  createLocationRequest();
              }
      
              public interface getLocation{
                  public void onLocationChanged(Location location);
              }
      
              public void startGettingLocation(getLocation location) {
                  mGetCurrentLocation = location;
                  connect();
              }
      
              public void stopGettingLocation() {
                  stopLocationUpdates();
                  disconnect();
              }
      
              private void createLocationRequest() {
                  mLocationRequest = new LocationRequest();
                  mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
                  mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
                  mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
              }
      
              private void startLocationUpdates() {
                  if (mGoogleApiClient.isConnected()) {
                      LocationServices.FusedLocationApi.requestLocationUpdates(
                              mGoogleApiClient, mLocationRequest, this);
                  }
              }
          private void stopLocationUpdates() {
              LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
          }
      
      
      
          private void connect() {
              mGoogleApiClient.connect();
          }
      
          private void disconnect() {
              if (mGoogleApiClient.isConnected()) {
                  mGoogleApiClient.disconnect();
              }
          }
      
          @Override
          public void onConnected(Bundle connectionHint) {
              Log.i(TAG, "Connected to GoogleApiClient");
              startLocationUpdates();
      
          }
      
          @Override
          public void onLocationChanged(Location location) {
              mGetCurrentLocation.onLocationChanged(location);
          }
      
          @Override
          public void onConnectionSuspended(int cause) {
              Log.i(TAG, "Connection suspended");
              mGoogleApiClient.connect();
          }
      
          @Override
          public void onConnectionFailed(ConnectionResult result) {
              Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
          }
      }
      

      在您的片段类中:

      private GetCurrentLocation mListen;
      mListen = new GetCurrentLocation(this);
                  mListen.startGettingLocation(new GetCurrentLocation.getLocation() {
                      @Override
                      public void onLocationChanged(Location location) {
                         // Here is my working with location object
                      }
      
                  });
      

      确保您在 gradle 文件中添加了最新的 googleplayservice 库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 2017-07-06
        • 2012-02-26
        • 1970-01-01
        相关资源
        最近更新 更多