Android - 获取位置的最简单方法[重复]

Posted

技术标签:

【中文标题】Android - 获取位置的最简单方法[重复]【英文标题】:Android - Easiest way to get location [duplicate] 【发布时间】:2018-05-06 15:20:36 【问题描述】:

Ciao!我有一个需要当前位置的 Activity,以便用户可以看到哪些对象靠近他。

好吧,我要为 GoogleApiClient、FusedLocation、回调等而疯狂,我得到的唯一结果是 getLastLocation 返回 null

我的 Activity 实现了 GoogleApiClient.ConnectionCallbacksGoogleApiClient.OnConnectionFailedListener

OnCreate 中我调用getLocation() 是这样的:

private void getLocation()
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(60*1000);
    locationRequest.setFastestInterval(10*1000);
    mFusedLocationApi = LocationServices.FusedLocationApi;
    gApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    if (gApiClient != null) 
        gApiClient.connect();
    

我也有这个:

@Override
protected void onStart() 
    super.onStart();
    if (gApiClient != null) 
        gApiClient.connect();
    


@Override
protected void onStop() 
    gApiClient.disconnect();
    super.onStop();


@Override
public void onConnectionFailed(ConnectionResult connectionResult) 
    Log.w("ADVSEARCH","Error on connection failed");


@Override
public void onConnectionSuspended(int i) 
    Log.w("ADVSEARCH","Error on connection suspended");


@Override
public void onConnected(Bundle bundle) 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 

        //lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);


        mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener() 
            @Override
            public void onLocationChanged(Location location) 
                lastlocation = location;
            
        );
    
    lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);

是的,在OnCreate 我检查权限。最低 API 16,目标 API 25。 每次我第一次打开应用程序时它都会崩溃,因为我在空对象上使用了distanceTo。我错过了什么?我搜索的越多,我就越困惑。

【问题讨论】:

“每次我第一次打开应用程序时它都会崩溃,因为我在一个空对象上使用了distanceTo”——您没有在问题的代码清单中使用distanceTo()。跨度> @CommonsWare 它只是clickListener 中的distanceTo(),没有其他相关行。我只写关于位置的代码,我知道lastLocation 是空的,因为我在distanceTo() 之前记录它。 好吧,getLastLocation() 可以返回null。在getLastLocation()onLocationChanged() 设置之前,您无需尝试使用lastlocation。例如,您可以禁用该按钮,直到获得非null 位置。 【参考方案1】:

我认为这可能是不同的事情,例如您没有在 Manifest 文件中设置所有内容,或者您​​在运行时没有权限(您需要在应用程序首次启动时允许这样做,或者在应用程序设置中手动设置)。试试这个...

build.gradle

implementation 'com.google.android.gms:play-services-location:11.6.0'

在您的 Activity.java

private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;

private void getLocationRequest() 
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
    if (!checkPermission()) 
        getLocationPermissions();
        return;
    
    client.getLastLocation()
            .addOnSuccessListener(this, new OnSuccessListener<Location>() 
                @Override
                public void onSuccess(Location location) 
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) 
                        // Logic to handle location object
                        Log.e("TAG", "location = " + location);
                     else 
                        Log.e("TAG", "not successful");
                    
                
            );


private boolean checkPermission() 
    return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) &&
            isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION));


@TargetApi(Build.VERSION_CODES.M)
private void getLocationPermissions() 
    requestPermissions(new String[] Manifest.permission.ACCESS_FINE_LOCATION,
            PERMISSION_REQUEST_FINE_LOCATION);


@Override
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results) 
    switch (code) 
        case PERMISSION_REQUEST_FINE_LOCATION:
            if (isPermissionGranted(results)) 
                getLocationRequest();
            
    


private boolean isPermissionGranted(int[] results) 
    return results != null && results.length > 0 && isGranted(results[0]);


private boolean isGranted(int permission) 
    return permission == PackageManager.PERMISSION_GRANTED;

这会询问您是否尚未设置权限,并在得到肯定的对话结果后再次调用getLocationRequest

并检查您的 AndroidManifest.xml

中是否有此内容
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />

当然,您必须适应您的需求(精细或粗糙的位置等)。

希望这能让你走上正轨;)

【讨论】:

或者你可以使用这个非常痛苦的库github.com/mrmans0n/smart-location-lib。 我删除了所有内容,现在,使用您的代码,它看起来可以正常工作。谢谢! @tuzzo 如果有帮助,请随时接受我的回答;)

以上是关于Android - 获取位置的最简单方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上获取用户当前位置的最简单、最可靠的方法是啥?

获取android设备位置的最可靠方法是啥?

从数据框中的所有列中获取值的最简单方法是啥[重复]

考虑到电池,Android 在后台重复获取位置的最佳方法

创建跨设备位置跟踪应用程序的最简单方法(全部 1 个应用程序)

Android获取当前位置的最佳方式[重复]