当前位置: 首页 > 知识库问答 >
问题:

如何获得位置使用融合的位置提供商在Android使用网络?

云季萌
2023-03-14

我一直在尝试使用andriod中的融合位置应用程序接口获取位置(lat/lon)。当wifi和gps都打开时,我的代码运行良好。如果我关闭gps,那么我不会得到任何位置更新。

我正在使用BALANCED_POWER_ACCURACY进行位置请求。我在清单中添加了Access_FINE_Location权限,并在我的build.gradle文件中使用了播放服务版本9.2.1。
我正在真实设备上进行测试(三星SM0G360H API 19和三星SM-G361 API 21)。两者给出相同的结果。
有人能告诉我融合位置应用程序接口到底是如何工作的吗?
当gps关闭但网络连接打开时,我如何获取位置更新?
我的代码:

public class LocationUpdateusingFused extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener{



TextView txtOutputLat, txtOutputLon;
Location mLastLocation;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
String lat, lon;

Intent batteryStatus;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fleet_layout);

    txtOutputLat = (TextView) findViewById(R.id.textView);
    txtOutputLon = (TextView) findViewById(R.id.textView2);


    buildGoogleApiClient();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    mLocationRequest.setMaxWaitTime(5000);
    mLocationRequest.setInterval(10000); // Update location every second

    try {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);


        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
    }
    catch (SecurityException e)
    {
        Log.e("LocatonUpdate",e+" ");
    }
    if (mLastLocation != null) {
        lat = String.valueOf(mLastLocation.getLatitude());
        lon = String.valueOf(mLastLocation.getLongitude());

    }
    updateUI();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onLocationChanged(Location location) {
    lat = String.valueOf(location.getLatitude());
    lon = String.valueOf(location.getLongitude());
    Log.e("LocationChanged",location.getSpeed()+" "+location.getAccuracy()+" "+location.getBearing()+" "+location.getProvider()+" "+location.getAltitude()
    );

    updateUI();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    buildGoogleApiClient();
}

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mGoogleApiClient.disconnect();
}
void updateUI() {
    txtOutputLat.setText(lat);
    txtOutputLon.setText(lon);
}
synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();


}

}

共有1个答案

蒋硕
2023-03-14

很抱歉,我耽搁了很长时间试图回答你的问题。我自己一直在与整个位置问题作斗争,所以我会为你提供我在“非常困难”之后注意到和学到的东西。希望你仍然需要某种答案。

我不记得API级别19设置的样子,但一般来说,API lvl 15及更高版本的所有位置设置(加上这里和那里的一些选项)都已设置为符合FusedLocationProviderAPI逻辑。我的意思是;您必须始终打开位置设置才能获得任何类型的位置更新,因为设置/切换控制一般位置。希望这回答了您的主要问题。

提供更多信息。正如masp在其中一条评论中提到的,您可以通过融合位置API的权限和常量来控制提供者实际使用的内容。

对于权限,您必须在ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION之间进行选择。区别是(我引用):

如果同时使用NETWORK\u PROVIDER和GPS\u PROVIDER,则只需请求ACCESS\u FINE\u LOCATION权限,因为它包括对这两个提供商的权限。ACCESS\u粗略位置权限仅允许访问NETWORK\u提供程序

然后我们得到了FusedLocationProviderAPI常量,这使得事情变得更加复杂。此外,从API 21级及以上,我们有:

如果进入模式,则会得到:

我不会详细介绍常量。它们已经在这个问题的公认答案中进行了测试。我建议你看看。不过,我需要提到的是,无论你如何使用这些,设置中的模式都优先。您可以在应用程序中要求提供GPS,但如果用户在设置中说省电,那就这样了。

我应该提到的最后一件事是,如果您将权限设置为ACCESS_COARSE_LOCATION那么期望可怕的准确性(在我上面链接的测试中也显示了)。我的建议是使用ACCESS_FINE_LOCATION,然后玩弄融合位置常量和间隔(setInterval和setFastestInterval)

希望这有助于一点,即使相当晚。

 类似资料:
  • 我正在检查移动设备上是否启用了位置服务,如果是,请监听构建GoogleAppClient并监听位置更改。我面临的问题是,一旦在mobile中打开位置并重新启用,我就无法获得位置(纬度/长)。位置始终为空。 isLocationEnabled检查位置是否已打开

  • 我想通过Android LocationManager API使用fused location provider,因为: 我不想让应用程序Phonelocator依赖于google play服务 现有的实现已经在工作和测试 看起来这是可能的。只需将字符串“融合”作为安装了google play服务的手机上的位置提供程序传递即可。 我想选择使用优先级高精度配置文件。我怀疑,默认情况下,它没有被使用。

  • 这个问题可能会被问很多次,但我找不到任何解决方案。我需要在后台获取用户的位置15分钟。 打开GPS时它可以正常工作,但关闭GPS时,应用程序不会收到位置更新。我需要它至少获取网络位置或wifi位置。 如何使用融合的位置API实现这一点? Location manager具有此功能,但处于融合位置。因为谷歌建议开发者使用play services API中的Location,所以我不想使用Locat

  • 嗨,我已经实现了融合位置提供程序Api,用于在服务中获取位置更新。我能够根据设置的间隔触发onlocationchange事件。但是,当我将setsmallstDisplace设置为10米时,即使设备静止,事件也会被触发。是否有人有类似的问题。请提供建议。下面是代码 为了找到两个位置值之间的距离,我使用了这种方法。 但是即使设备是静止的,我也能得到43.51 , 49.32 , 520.02的距离

  • 我在MainActivity类中有一个提供纬度和经度值的融合位置提供程序代码,它使用persistableBundle传递给JobService类。当用户使用应用程序时,它工作正常(即应用程序位于前台)。一旦应用程序被刷出或销毁,MainActivity的最后更新值就会一直通过作业调度器重复上传(即,作业调度器始终获得相同的值,融合的位置提供程序不工作)。即使应用程序不在前台,我应该怎么做才能使其

  • 我一直在尝试获取我当前的位置更新,并按照Google的建议使用了融合位置提供商,但我无法获得任何更新。我在网上彻底搜索了,但找不到任何解决方案。融合提供商返回的位置甚至不接近我所在的位置,它显示了其他一些国家。有人能在这里帮我吗?