此处将为大家介绍关于AndroidGoogleMapsLocationClient的详细内容,此外,我们还将为您介绍关于AndroidGoogleMaps:getLastLocation与reques
此处将为大家介绍关于Android Google Maps LocationClient的详细内容,此外,我们还将为您介绍关于Android Google Maps:getLastLocation与requestLocationUpdates、Android GoogleMaps myLocation权限、Android Java-Google LocationRequest和LocationManager的问题、android – Google Maps API v2调用点击mylocationbutton的行为的有用信息。
本文目录一览:- Android Google Maps LocationClient
- Android Google Maps:getLastLocation与requestLocationUpdates
- Android GoogleMaps myLocation权限
- Android Java-Google LocationRequest和LocationManager的问题
- android – Google Maps API v2调用点击mylocationbutton的行为
Android Google Maps LocationClient
我在Android应用程序中使用Google Maps Android API v2 LocationClient:
http://developer.android.com/reference/com/google/android/gms/location/LocationClient.html
我自己打电话给connect()和断开连接().
我还为GooglePlayServicesClient.ConnectionCallbacks注册了一个侦听器:
http://developer.android.com/reference/com/google/android/gms/common/GooglePlayServicesClient.ConnectionCallbacks.html
我观察到在LocationClient上调用connect()之后,在侦听器上调用了回调onConnected().
但是,似乎在LocationClient上调用disconnect()之后,从未在侦听器上调用过ondisconnected().
这是正常行为吗?
解决方法:
我想有点晚了,但我也想知道,所以我会回复.
这是正常的行为. api文档尚不清楚,但是在官方教程http://developer.android.com/training/location/retrieve-current.html中,它说明了ondisconnected:
Called by Location Services if the connection to the location client
drops because of an error.
这意味着如果您自己调用disconnect(),则不应调用它.
Android Google Maps:getLastLocation与requestLocationUpdates
我只需要清楚地了解这一点,getLastLocation()方法将给我最后一个已知的位置,而requestLocationUpdates将在每个时间段给我当前的位置.
现在,我正在开发一个简单的应用程序来跟踪将在汽车中使用的手机.
我的问题是:
1- getLastLocation()的工作原理,当位置更改时,此最后一个已知位置是否会更新
2-更好的方法是,使用getLastLocation()获取初始位置,然后通过使用onLocationChanged方法或使用requestLocationUpdates更新每n秒的最新位置来更新当前位置?
解决方法:
getLastLocation为您提供了LocationClient中存在的最后一个位置,有时它可以为null,例如,如果您没有安装任何其他使用位置服务的应用程序,那么这种情况很少见,因为大多数手机都装有Google地图或某些其他位置相关的应用程序已安装.
getLastLocation仅在您需要一次定位并完成定位时才有用,但是对于位置更新,您应该使用requestLocationUpdates,并且使用服务,当位置更改时,始终会通知您的应用程序.
我希望您使用播放服务中的FusedLocation Provider,以便您可以指定所需的位置更新速度,以检查电池消耗和性能情况.
在这里还需要注意的是,当您使用requestLocationUpdates时,只有您将获得任何位置更改更新.
Android GoogleMaps myLocation权限
使用最新版本的Android …您应该先检查用户是否已授予您权限,然后再使用其位置信息.我已经阅读了android docs,这是我想出的代码.
我正在检查用户是否已被授予权限,如果尚未授予用户…则我们询问,然后结果上有一个回调函数,依此类推.
我已经遍历了很多次代码,并且除了似乎一切正常之外:当我终于尝试使用fusedLocationApi.getLastLocation以编程方式获取用户的位置时……它返回NULL!
我已经重新上传了我拥有的代码.
任何可以弄清楚这一点并且对我真正有用的人,您可以得到我所有的代表分数…
package com.example.greg.rightNow;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.Manifest;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.Api;
import com.google.android.gms.common.api.Googleapiclient.ConnectionCallbacks;
import com.google.android.gms.common.api.Googleapiclient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.plus.Plus;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks {
private Googleapiclient mGoogleapiclient;
private GoogleMap mMap;
private Location mLastLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
// Create an instance of Googleapiclient.
mGoogleapiclient = new Googleapiclient.Builder(this)
.addApi(Drive.API)
.addApi(Plus.API)
.addScope(Drive.ScopE_FILE)
.addConnectionCallbacks(this)
// .addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
protected void onStart() {
mGoogleapiclient.connect();
super.onStart();
}
protected void onStop() {
mGoogleapiclient.disconnect();
super.onStop();
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
* Manifest.permission.ACCESS_FINE_LOCATION
*/
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == grantResults[0]) {
mMap.setMyLocationEnabled(true);
}
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleapiclient);
LatLng myLat = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(myLat));
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== 0) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
else if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) ==-1) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleapiclient);
LatLng myLat = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(myLat));
}
}
@Override
public void onConnectionSuspended(int i) {
}
}
您会注意到,我不得不对此行进行注释:
// .addOnConnectionFailedListener(this)
如果我取消注释…,则“ this”用红色下划线,并且收到错误消息,指出“ …在Builder中无法应用于com.example.greg.MapsActivity等”
解决方法:
使用ContextCompat.checkSelfPermission检查权限后,如果未授予权限,则可以请求该权限.从the documentation开始:
另外,使用Googleapiclient(documentation)时,您需要处理连接失败的问题.在您的代码中,连接失败,您没有在onConnectionFailed上对其进行管理.
最后,我从您的代码中删除了以下内容(这导致连接失败,不需要使用LocationServices并获取最后的位置):
.addApi(Drive.API)
.addApi(Plus.API)
.addScope(Drive.ScopE_FILE)
这是一个工作示例:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, Googleapiclient.ConnectionCallbacks, Googleapiclient.OnConnectionFailedListener {
private static final int FINE_LOCATION_PERMISSION_REQUEST = 1;
private static final int CONNECTION_RESOLUTION_REQUEST = 2;
private Googleapiclient mGoogleapiclient;
private GoogleMap mMap;
private Location mLastLocation;
@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);
buildGoogleapiclient();
}
@Override
protected void onResume() {
super.onResume();
buildGoogleapiclient();
}
private void buildGoogleapiclient() {
if (mGoogleapiclient == null) {
mGoogleapiclient = new Googleapiclient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
findLocation();
}
protected void onStart() {
mGoogleapiclient.connect();
super.onStart();
}
protected void onStop() {
mGoogleapiclient.disconnect();
super.onStop();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this, "Connection suspended", Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(@NonNull final ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
try {
connectionResult.startResolutionForResult(this, CONNECTION_RESOLUTION_REQUEST);
} catch (IntentSender.SendIntentException e) {
// There was an error with the resolution intent. Try again.
mGoogleapiclient.connect();
}
} else {
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(), this, 1);
dialog.show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CONNECTION_RESOLUTION_REQUEST && resultCode == RESULT_OK) {
mGoogleapiclient.connect();
}
}
private void findLocation() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
FINE_LOCATION_PERMISSION_REQUEST);
} else {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleapiclient);
LatLng myLat = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(myLat));
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case FINE_LOCATION_PERMISSION_REQUEST: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
findLocation();
}
}
}
}
}
Android Java-Google LocationRequest和LocationManager的问题
如何解决Android Java-Google LocationRequest和LocationManager的问题?
(编辑:修复了LocationManager更新,,但是使用Google Api对话框启用GPS后,我仍然始终在onActivityResult中得到RESULT_Failed。)
任何人都可以告诉我为什么如果我使用Google Api对话框启用GPS以及手动启用GPS,LocationManager位置更新为什么会停止工作?谢谢!
还有为什么我在使用Google Api对话框启用GPS(并正确启用GPS)后总是在onActivityReturn中得到RESULT_Failed?
我需要一些有关此问题的信息和帮助。
我做了一个utils类,以使用Google Dialog启用gps高精度:
<!doctype html>
<html lang="en">
<head>
<Meta charset="UTF-8">
<Meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="css/layout.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Grafiek</title>
<style>
.red{
background-color:red;
}
.blue{
background-color:blue;
}
.green{
background-color:green;
}
</style>
</head>
<body>
<h1>Server Stats</h1>
<div id="maindiv">
<div id="server1">
<h3>(servername1)</h3>
<div>
Status:
</div>
<br>
<div>
Last Checked:
</div>
<div>
Last Online:
</div>
<div>
<button onclick="toggleStatus(''server1'',''red'')">yes</button>
</div>
</div>
<div id="server2">
<h3>(servername2)</h3>
<div>
Status:
</div>
<br>
<div>
Last Checked:
</div>
<div>
Last Online:
</div>
<div>
<button onclick="toggleStatus(''server2'',''green'')">yes</button>
</div>
</div>
<div id="server3">
<h3>(servername3)</h3>
<div>
Status:
</div>
<br>
<div>
Last Checked:
</div>
<div>
Last Online:
</div>
<div>
<button onclick="toggleStatus(''server3'',''blue'')">yes</button>
</div>
</div>
</div>
</body>
</html>
我还尝试将此类更改为:
public class EnableLocationCallback implements OnCompleteListener<LocationSettingsResponse> {
// Millis Interval
private static final long MILLIS_FASTEST_INTERVAL = 1000L;
private static final long MILLIS_INTERVAL = MILLIS_FASTEST_INTERVAL * 0xA;
private Activity mActivity;
private int mRequestCode;
public static void requestEnableLocation(Activity activity,int requestCode){
new EnableLocationCallback(activity,requestCode).requestEnableLocation();
}
private EnableLocationCallback(Activity activity,int requestCode){
mActivity = activity;
mRequestCode = requestCode;
}
/** Override OnCompleteListener<LocationSettingsResponse> Methods **/
@Override
public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
try {
task.getResult(ApiException.class);
} catch (ApiException ex){
switch (ex.getStatusCode()){
case LocationSettingsstatusCodes.RESOLUTION_required:
try {
((ResolvableApiException) ex).startResolutionForResult(mActivity,mRequestCode);
} catch (IntentSender.SendIntentException e) {
openGpsEnabledSettings();
}
break;
case LocationSettingsstatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
openGpsEnabledSettings();
break;
}
}
}
/** Private Methods **/
private void requestEnableLocation(){
getSettingsClient(mActivity)
.checkLocationSettings(getLocationSettingsRequest())
.addOnCompleteListener(this);
}
private LocationRequest getLocationRequest(){
return LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(MILLIS_INTERVAL)
.setFastestInterval(MILLIS_FASTEST_INTERVAL);
}
private LocationSettingsRequest getLocationSettingsRequest(){
return new LocationSettingsRequest.Builder()
.addLocationRequest(getLocationRequest())
.setAlwaysShow(true)
.build();
}
private void openGpsEnabledSettings(){
mActivity.startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS),mRequestCode);
}
}
在两种情况下,我都启用了GPS,但GPS启用了“高精度”启用,但是... 在我的活动“ onActivityResult”上,我总是得到resultCode == -0x1(如此失败)。
我还看到,在开始使用此代码后,我正在使用此代码进行位置更新的所有零件(单个更新或多个):
public class EnableLocationCallback implements
Googleapiclient.ConnectionCallbacks,Googleapiclient.OnConnectionFailedListener {
// Millis Interval
private static final long MILLIS_FASTEST_INTERVAL = Constants.MILLIS_ONE_SECOND * 0x5;
private static final long MILLIS_INTERVAL = Constants.TIMEOUT_GET_POSITION;
private Googleapiclient mGoogleapiclient;
private Activity mActivity;
private int mRequestCode;
public static void requestEnableLocation(Activity activity,int requestCode){
EnableLocationCallback instance = new EnableLocationCallback(activity,requestCode);
instance.initGoogleapiclient();
instance.initLocationSettingResultCallback();
}
private EnableLocationCallback(Activity activity,int requestCode){
mActivity = activity;
mRequestCode = requestCode;
}
/** Override Googleapiclient.ConnectionCallbacks Methods **/
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
/** Override Googleapiclient.OnConnectionFailedListener Methods **/
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
/** Private Methods **/
private void initGoogleapiclient(){
mGoogleapiclient = new Googleapiclient.Builder(mActivity)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.build();
mGoogleapiclient.connect();
}
private void initLocationSettingResultCallback(){
LocationServices.SettingsApi.checkLocationSettings(mGoogleapiclient,getLocationSettingsRequest()).setResultCallback(
result -> {
final Status status = result.getStatus();
final LocationSettingsstates state = result.getLocationSettingsstates();
switch (status.getStatusCode()) {
case LocationSettingsstatusCodes.SUCCESS:
break;
case LocationSettingsstatusCodes.RESOLUTION_required:
try {
status.startResolutionForResult(mActivity,mRequestCode);
} catch (IntentSender.SendIntentException e) {
openGpsEnabledSettings();
}
break;
case LocationSettingsstatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
openGpsEnabledSettings();
break;
}
}
);
}
private void requestEnableLocation(){
getSettingsClient(mActivity)
.checkLocationSettings(getLocationSettingsRequest());
}
private LocationRequest getLocationRequest(){
return LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(MILLIS_INTERVAL)
.setFastestInterval(MILLIS_FASTEST_INTERVAL);
}
private LocationSettingsRequest getLocationSettingsRequest(){
return new LocationSettingsRequest.Builder()
.addLocationRequest(getLocationRequest())
.setAlwaysShow(true)
.build();
}
private void openGpsEnabledSettings(){
mActivity.startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS),mRequestCode);
}
}
所有这些部分停止工作。 我使用gps更新对话框无法启用GPS,如果我手动启用它也将无法使用!
您能解释一下并告诉我如何解决吗?
我还将希望看到有关“ Google SettingsClient”,“ GoogleApi
例如... google页面仅告诉您一些信息,我没有告诉您扩展类后应该传递给超级构造函数的东西,以及许多其他事情:/
非常感谢您, 祝您编码愉快,并祝您愉快:D
#EDIT: 我通过使用“ FusedLocationManager”和正确的LocationListener进行位置更新来修复了LocationManager更新。 但是在使用对话框正确启用GPS后,我仍然总是会得到RESULT_FAILED。 我现在的课程是:
mLocationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,mUserPositionListener,null);
我从这里使用@Janishar Ali的答案来改善我的课程: Janishar Ali Answer Link
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
android – Google Maps API v2调用点击mylocationbutton的行为
mMap.setMyLocationEnabled(true);
我想要实现的是实际点击按钮的功能,该按钮现在出现在GoogleMap上(即,使用正确的缩放等将地图设置为用户位置的动画).
功能已经在GoogleMap对象中,我该如何使用它?
我不想使用LocationListener等来实现这一点,我只想“调用相同的代码”,当我点击地图上的按钮时,它会被调用.可以这么简单吗?
提前致谢.
编辑:
我基本上想要做的是将地图置于用户位置,这与我单击按钮时GoogleMap在用户位置中心的方式完全相同.像这样:
GoogleMap mMap = this.getMap(); if(mMap != null) { mMap.setMyLocationEnabled(true); //Todo center the map on mylocation }
编辑:
显然谷歌正在努力解决这个问题. http://code.google.com/p/gmaps-api-issues/issues/detail?id=4644
解决方法
例如,当您缩小显示时,单击该按钮会在放大时将您设置为您的位置动画,而如果您已经处于某些缩放级别,则单击该按钮只会在保持当前状态的同时将您设置为您的位置.缩放级别.
如果我们只是简单地获得对MyLocationButton的引用并且只是,你知道,点击它就不是那么费力地试图复制这种行为,而不是很难.嗯,这是我发现当前最好的方法:
@OnClick(R.id.fabMyLocation) public void onMyLocationClick(FloatingActionButton fabMyLocation) { View myLocationButton = ((View) mapFragment.getView().findViewById(Integer.parseInt("1")).getParent()) .findViewById(Integer.parseInt("2")); myLocationButton.performClick(); }
是的,它并不漂亮,并且依赖于可能在未来版本的Google Maps API中更改的硬编码ID.但是这种检索按钮的方法基于this highly rated answer from 2013,到目前为止,从Google Play Services 8.4.0开始,仍然可以正常运行.
关于Android Google Maps LocationClient的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Google Maps:getLastLocation与requestLocationUpdates、Android GoogleMaps myLocation权限、Android Java-Google LocationRequest和LocationManager的问题、android – Google Maps API v2调用点击mylocationbutton的行为等相关知识的信息别忘了在本站进行查找喔。
本文标签: