在Android中查找用户的当前位置

Posted

技术标签:

【中文标题】在Android中查找用户的当前位置【英文标题】:Finding current location of the user in Android 【发布时间】:2016-11-18 04:50:46 【问题描述】:

我是 android 新手,我正在尝试开发一个显示用户当前位置的 Android 应用程序。我正在使用 Genymotion。现在我正在使用

mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient); 

获取设备的最后位置。问题是我想获得当前位置,但有了这个我得到mlocation 不为空,这很好。但在地图中,它始终显示设备的最后位置,而不是当前位置。

代码 sn-p

@Override
public void onConnected(Bundle bundle) 
    Log.i(TAG, "inside onconnected Location services connected");
    Location mLocation=null;
    mLocationRequest= new LocationRequest();
    mLocationRequest.setInterval(10 * 1000)    ;   
    mLocationRequest.setFastestInterval(1 * 1000);mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
        PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission(this,
        Manifest.permission.ACCESS_COARSE_LOCATION) !=
        PackageManager.PERMISSION_GRANTED) 

    
               mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient);
    if(mLocation==null)
    
        Log.d("***Inside mlocation***", "***mlocation is null here");
    

    if (mLocation != null) 
        onLocationChanged(mLocation);
    
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleClient, mLocationRequest, this);


@Override
public void onLocationChanged(Location location) 
    double currentLatitude = location.getLatitude();
    double currentLongitude = location.getLongitude();
    LatLng latLng = new LatLng(currentLatitude,currentLongitude);
    MarkerOptions options = new MarkerOptions()
            .position(latLng)
            .title("Im here!");

    mMap.addMarker(options);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

onstart() 中,我调用了googleapi.connect(),并适当地使用了setUpMapIfNeeded()

请告诉我这段代码有什么问题。我正在尝试这个 3 天。

【问题讨论】:

在您的代码中没有提及 gps 开/关。你应该在应用程序前台打开gps。 嗨,杰伊,我的模拟器中的 gps 已打开,但我从你的陈述中了解到,我需要检查 gps 的可用性,对吗??但我认为它也没有任何区别。 检查我的答案@Navi 【参考方案1】:

用代码发布简单的解决方案。

在 AndroidManifest.xml 文件中添加权限

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果您的应用与棉花糖兼容,请检查运行时权限。

在 gradle 文件中添加依赖:

compile 'com.google.android.gms:play-services:9.2.0'

在你的活动中实现这两个接口

GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener

在 oncreate 中像这样创建 googleapiclient 对象:

mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

并在开始活动时进行此操作

mGoogleApiClient.connect();

我们在此覆盖方法上继续位置的结果回调。

public void onConnected(@Nullable Bundle bundle) 
    Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) 
        Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude()));
     else 
        Toast.makeText(getApplicationContext(), "Your Location Not Found", Toast.LENGTH_LONG).show();
    

完整的活动代码是这样的:

public class LocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener 

private static final String TAG = LocationActivity.class.getSimpleName();

private GoogleApiClient mGoogleApiClient;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_location);


    // Create an instance of GoogleAPIClient.
    if (mGoogleApiClient == null) 
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    


@Override
protected void onStart() 
// connect googleapiclient
    mGoogleApiClient.connect();
    super.onStart();


@Override
protected void onStop() 
// disconnect googleapiclient
    mGoogleApiClient.disconnect();
    super.onStop();


@Override
public void onConnected(@Nullable Bundle bundle) 
    Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) 
    // here we go you can see current lat long.
        Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude()));
    


@Override
public void onConnectionSuspended(int i) 



@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 


p.s. googleapiclient 无法在没有播放服务的模拟器中运行,因此您必须在真实设备上进行测试。 请确保在该设备上启用了 gps。

如果您想使用传统方法获取位置,请尝试本教程。 http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/

------更新 6 月 15 日---------

最新的api 检查安卓谷歌帖子: https://android-developers.googleblog.com/2017/06/reduce-friction-with-new-location-apis.html

【讨论】:

我写了和上面一样的代码。完全一样,加上一些标记就是这样..但没有得到什么问题。 你的意思是说即使在模拟器中安装了google play服务之后,这段代码也不起作用..?因为我的精灵动作已经安装了所有东西..现在我必须做什么..我需要在我的安卓手机上测试它吗..? 杰伊你知道吗..我得到了像纬度经度这样的一切,使用地理编码器我什至还能得到地址..但这是错误的,因为我得到的是模拟器以前位置的纬度和经度,而不是我的当前位置。我尝试了所有方法都没有解决问题.. 杰伊我不能在***中分享你的apk文件..那个功能不在那里..那我怎么给你..?? @Navi 让群聊chat.***.com/rooms/117677/abcdxyz【参考方案2】:

对于地图服务,它需要 Google Play 服务。如果没有,请确保您的 Genymotion 已安装 PlayService 从Here 获得帮助以在 Genymotion 中安装 Google Play 服务。 快乐编码..!!!

【讨论】:

hi raj,google play 服务安装正确。 Google Map Api With Android Official Documentation Here->developers.google.com/maps/documentation/android-api【参考方案3】:
     LocationListener locationListener;
        LocationManager locationManager;
        double latitude;
        double longitude;  


       locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);


        locationListener = new LocationListener()
        
            @Override


            public void onLocationChanged(Location location) 

    longitude = location.getLongitude();
    latitude = location.getLatitude();
  

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) 
            

            @Override
            public void onProviderEnabled(String provider) 
            

            @Override
            public void onProviderDisabled(String provider) 
            
        ;
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.

            ;
        
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener);



        Log.e("location", longitude + " " + latitude);

【讨论】:

嗨,Nandish,我添加了相同的代码并进行了相应的更改,但我仍然得到了相同的旧位置。在上面的代码中,我有一个疑问,当调用 onLocationChanged() 时,位置对象为空,对吧..??因为我们没有向它传递任何价值.. 请建议我..

以上是关于在Android中查找用户的当前位置的主要内容,如果未能解决你的问题,请参考以下文章

Android - 查找当前是不是正在播放音频并停止它

从后台服务android查找当前位置

是否需要 Google Play 服务才能在 Android 手机上查找当前 gps 位置?

在Android中获取用户当前位置的最简单方法是啥?

如何在 Android 中查找您是不是面对某个位置?

Android 位置未在真实设备中显示