没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged
Posted
技术标签:
【中文标题】没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged【英文标题】:onLocationChanged does not get called using fusedLocationAPI.requestLocationUpdates 【发布时间】:2016-11-14 11:44:21 【问题描述】:我一直在尝试使用 fusedLocationApi 来获取我当前的位置。我正在使用带有模拟 Nexus 6 的 android studio。根据在线文档 https://developer.android.com/training/location/receive-location-updates.html?hl=es 我们可以使用以下方式请求位置更新:
FusedLocationApi.requestLocationUpdates
然后回调转到:
onLocationChanged(位置位置)
但是,onLocationChanged 根本没有被调用。如果是这样,它会在日志中打印一些东西,因为我在那里放了一个 Log.d 行。请注意,确实会调用 startLocationUpdates()。下面是我的代码。如果有人能对此有所了解,那就太好了=)我对Android真的很陌生,所以我有点无能为力。会不会是模拟器(GPS,.. idk)导致了这个问题?
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener
private GoogleMap mMap; // google map works well just as default project
private GoogleApiClient mGoogleApiClient;
public static final String TAG = MapsActivity.class.getSimpleName();
private LocationRequest mLocationRequest;
private static final int REQUEST_LOCATION = 2;
private Location location;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(1000)
.setFastestInterval(100);
@Override
public void onConnected(@Nullable Bundle bundle)
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
REQUEST_LOCATION);
else
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location == null)
startLocationUpdates();
else
handleNewLocation(location);
;
protected void startLocationUpdates()
Log.d(TAG, "Requesting location updates");
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
@Override
public void onLocationChanged(Location location)
String msg = "Updated Location: " +
Double.toString(location.getLatitude()) + "," +
Double.toString(location.getLongitude());
Log.d(TAG, msg);
manifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Gradle 构建:
dependencies
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.google.android.gms:play-services:9.0.0'
【问题讨论】:
【参考方案1】:您确定您的 GPS 已打开吗?您可以尝试通过 Google Google 在 GitHub 上浏览此示例项目。在这个项目中,他们还提供了检查位置服务是否启用的代码。如果不是,用户将收到一条消息,以便他们可以激活他们的位置服务。
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.mapdemo;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
/**
* This demo shows how GMS Location can be used to check for changes to the users location. The
* "My Location" button uses GMS Location to set the blue dot representing the users location.
* Permission for @link android.Manifest.permission#ACCESS_FINE_LOCATION is requested at run
* time. If the permission has not been granted, the Activity is finished with an error message.
*/
public class MyLocationDemoActivity extends AppCompatActivity
implements
OnMyLocationButtonClickListener,
OnMapReadyCallback,
ActivityCompat.OnRequestPermissionsResultCallback
/**
* Request code for location permission request.
*
* @see #onRequestPermissionsResult(int, String[], int[])
*/
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;
/**
* Flag indicating whether a requested permission has been denied after returning in
* @link #onRequestPermissionsResult(int, String[], int[]).
*/
private boolean mPermissionDenied = false;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.my_location_demo);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
@Override
public void onMapReady(GoogleMap map)
mMap = map;
mMap.setOnMyLocationButtonClickListener(this);
enableMyLocation();
/**
* Enables the My Location layer if the fine location permission has been granted.
*/
private void enableMyLocation()
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
// Permission to access the location is missing.
PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
Manifest.permission.ACCESS_FINE_LOCATION, true);
else if (mMap != null)
// Access to the location has been granted to the app.
mMap.setMyLocationEnabled(true);
@Override
public boolean onMyLocationButtonClick()
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
// Return false so that we don't consume the event and the default behavior still occurs
// (the camera animates to the user's current position).
return false;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults)
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE)
return;
if (PermissionUtils.isPermissionGranted(permissions, grantResults,
Manifest.permission.ACCESS_FINE_LOCATION))
// Enable the my location layer if the permission has been granted.
enableMyLocation();
else
// Display the missing permission error dialog when the fragments resume.
mPermissionDenied = true;
@Override
protected void onResumeFragments()
super.onResumeFragments();
if (mPermissionDenied)
// Permission was not granted, display error dialog.
showMissingPermissionError();
mPermissionDenied = false;
/**
* Displays a dialog with error message explaining that the location permission is missing.
*/
private void showMissingPermissionError()
PermissionUtils.PermissionDeniedDialog
.newInstance(true).show(getSupportFragmentManager(), "dialog");
【讨论】:
【参考方案2】:老问题,但除非我上次尝试后发生了变化,否则模拟器不知道它的位置。你必须给它发送坐标。
【讨论】:
以上是关于没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript]有没有办法在没有终端的情况下使用 Cloudinary
ServiceStack RedisMessageQueueClient:错误没有返回到ReplyTo地址,也没有使用RetryAttempts?