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

融合的位置提供程序始终返回相同的位置

仲孙夕
2023-03-14

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

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

    private LocationRequest mLocationRequest;
    private GoogleApiClient mGoogleApiClient;
    private TextView mLocationTextView;

    private static final int LOC_PERMISSION_CODE = 100;
    private Location mCurrentLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        createLocationRequest();

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


        mLocationTextView = (TextView) findViewById(R.id.location);
    }

    private boolean isLocationProviderAvailable(){
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER) || lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }

    private void requestLocation() {
        if (!hasLocationPermission()) {
            ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION}, LOC_PERMISSION_CODE);
        }else {

            if(!isLocationProviderAvailable()){
                AlertDialog dialog = new AlertDialog.Builder(this)
                        .setTitle("No location service")
                        .setMessage("Location adapters are turned off. Please turn on and try again.")
                        .setIcon(R.drawable.location_icon)
                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                finish();
                            }
                        })
                        .create();
                dialog.show();
            }else {
                //noinspection MissingPermission
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            }
        }
    }
    private boolean hasLocationPermission(){
        return ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
    }

    private void createLocationRequest(){
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setInterval(1000 * 10);
        mLocationRequest.setFastestInterval(1000 * 5);
        mLocationRequest.setNumUpdates(2);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        if(requestCode == LOC_PERMISSION_CODE){
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                requestLocation();
            }else {
                Toast.makeText(this, "Permission Required.", Toast.LENGTH_SHORT).show();
            }
        }
    }


    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        log("onConnectionFailed -> %s", connectionResult.getErrorMessage());
    }

    private void log(String format, Object... args){
        Log.d("MainActivity", String.format(format, args));
    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        log("onLocationChanged()");
        updateUI();
    }

    private void updateUI(){
        log("updateUI()");
        if(null != mCurrentLocation) {
            mLocationTextView.setText(String.format("Lat: %s, Lon: %s", mCurrentLocation.getLatitude(), mCurrentLocation.getLatitude()));
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        requestLocation();
        log("onConnected()");
    }

    @Override
    public void onConnectionSuspended(int i) {
        log("onConnectionSuspended()");
    }
}

共有1个答案

富建章
2023-03-14
"Lat: %s, Lon: %s", mCurrentLocation.getLatitude(), mCurrentLocation.getLatitude())

第二个参数应该是getLongity,而不是getLati纬度

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

  • 这就是我如何注册我的应用程序来接收位置更新: 我悬而未决的意图几乎在所要求的时间间隔内被后台调用... 到目前为止还好。 问题:当WIFI被禁用/没有连接到任何网络,或者当没有3G/4G网络数据启用-融合位置提供商没有提供新的位置更新!! 我的位置访问设置打开,并检查GPS卫星和WI-FI和移动网络位置。 更大的问题是:有时在这种情况下,我确实通过挂起的意图接收位置更新回调,但它知道最后的位置(即

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

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

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

  • 当我悬停在第一个Div上时,工具提示显示得比我悬停在下面两个Div上时更远。显然,这是因为div中的文本更大/更长。但是我不想显示不依赖于悬停文本的工具提示跨度,而是与文本的包含div相关,所以它总是显示在相同的位置。 jQuery不是任何选项,但我认为,这是一个CSS问题。 null null