最后一个已知位置始终为 0 [重复]

Posted

技术标签:

【中文标题】最后一个已知位置始终为 0 [重复]【英文标题】:last known location is always 0 [duplicate] 【发布时间】:2019-12-08 04:55:43 【问题描述】:

尽管我尽了最大的努力,我还是无法正确定位我的位置。这是我的 ma​​in.java

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        //new SecondFragment();
        //TabLayout tabs = findViewById(R.id.tabs);
        //tabs.setupWithViewPager(viewPager);
        FloatingActionButton fab = findViewById(R.id.fab);
        FontDrawable drawable = new FontDrawable(this, R.string.fa_plus_solid, true, false);
        drawable.setTextColor(ContextCompat.getColor(this, android.R.color.white));
        fab.setImageDrawable(drawable);

        fab.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            
        );

        //Check permission
        if (ContextCompat.checkSelfPermission(getApplicationContext(),
                android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(getApplicationContext(),
                        android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            ActivityCompat.requestPermissions(this,
                    new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
                            android.Manifest.permission.ACCESS_COARSE_LOCATION, 101);
            FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
            mFusedLocationClient.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) 
                                latlang.Lat =location.getLatitude();
                                latlang.Lang =location.getLongitude();
                            
                        
                    );

        
    

latlang 在另一个文件中定义为:

public class latlang 
    public static double Lat;
    public static double Lang;

如果我在 latlang 中对值进行硬编码,一切都很好。但是,我当然想要last known location 的值。

请帮忙。

【问题讨论】:

首先——代码真的运行了吗?如果您创建了变量但从未设置它,则 0 是 int 的默认值。其次,getLastLocation 并不总是有效,因为由于电池原因,系统并不总是跟踪您的当前位置。因此,如果最近有其他东西要求位置,它只会有最后一个位置。您需要请求更新以确保位置。第三——记住这些将被异步调用的回调。不要假设数据会在任何特定时间范围内准备就绪。 @GabeSechan:是的,代码确实在模拟器和实际设备中运行。我在想我在这里设置值,但显然不是。 ` if (location != null) latlang.Lat =location.getLatitude(); latlang.Lang =location.getLongitude(); ` 好心,如果你有时间,你能告诉我怎么做吗? SO充满了android位置问题,没有两个ans是相似的。 【参考方案1】:

问题是您尝试在授予权限之前获取位置。 调用requestPermissions() 后,您会立即尝试在显示权限对话框时获取位置,这意味着在您看到权限对话框时正在执行获取位置的代码。这就是为什么在活动中有onRequestPermissionsResult 函数仅在用户完成权限对话框后才报告的原因。 您需要在onRequestPermissionsResult() 中获取位置。

您的代码中的第二个问题是您只有在未授予权限时才能获取位置。您的代码不会处理已授予权限的情况。

以下是解决此问题的方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) 
     if (ContextCompat.checkSelfPermission(getApplicationContext(),
       android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
      ActivityCompat.checkSelfPermission(getApplicationContext(),
       android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
      ActivityCompat.requestPermissions(this,
       new String[] 
        android.Manifest.permission.ACCESS_FINE_LOCATION,
         android.Manifest.permission.ACCESS_COARSE_LOCATION
       , 101);
      else 
      fetchLocation();
     
    

    @Override
    public void onRequestPermissionsResult(int requestCode,
     String[] permissions, int[] grantResults) 
     switch (requestCode) 
      case 101:
       
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0 &&
         (grantResults[0] == PackageManager.PERMISSION_GRANTED ||
          grantResults[1] == PackageManager.PERMISSION_GRANTED)) 
         // permission was granted
         fetchLocation()
         else 
         Show some error
        
        return;
       

       // other 'case' lines to check for other
       // permissions this app might request.
     
    

    public void fetchLocation() 
     FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
     mFusedLocationClient.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) 
         latlang.Lat = location.getLatitude();
         latlang.Lang = location.getLongitude();
        
       
      );

    

基本上,创建一个单独的函数来获取位置。您将从 2 个位置调用此函数。第一个在授予权限时在onCreate,第二个在onPermissionResult。不要忘记处理权限错误。

【讨论】:

以上是关于最后一个已知位置始终为 0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

GetLastLocation 始终返回 null

CLLocationManager 最后一个已知位置

SQL - 重复最后一个已知值,直到昨天

在设备位置关闭时从 Google Play 服务获取最后一个已知位置

getLastKnownLocation() Android,最后一个已知位置何时更新?

C# textbox中鼠标光标位置始终在最后 谢谢