www.91084.com

GVKun编程网logo

Android Google Maps LocationClient

5

此处将为大家介绍关于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 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

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 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的问题

如何解决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的行为

android – Google Maps API v2调用点击mylocationbutton的行为

我有一个完全正常工作的GoogleMap,我可以通过调用显示我的用户位置

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

解决方法

不确定为什么其他答案正在谈论OnMyLocationchangelisteners.这不是OP中提出的问题.问的是如何复制点击MyLocationButton的确切行为,这实际上比仅仅将相机设置为用户位置更复杂.该按钮根据您当前所处的缩放级别执行不同的操作.

例如,当您缩小显示时,单击该按钮会在放大时将您设置为您的位置动画,而如果您已经处于某些缩放级别,则单击该按钮只会在保持当前状态的同时将您设置为您的位置.缩放级别.

如果我们只是简单地获得对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的行为等相关知识的信息别忘了在本站进行查找喔。

本文标签: