Location Listener 在 Android 6.0 中有效,但在 android 8.0+ 中无效

Location Listener works in Android 6.0 but not android 8.0+

我正在学习如何在应用程序中使用地理定位,我遇到了这个问题,我可以在模拟 Android 6.0 时获取用户的位置,但是当我尝试 运行 相同的确切代码时在 Android 8.0 中,我无法获取用户的位置。老实说,我不明白我哪里错了或者为什么它不起作用。这是我的代码:

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    LocationManager locationManager;
    LocationListener locationListener;

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

        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }
    }

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

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

        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(@NonNull Location location) {
                Log.i("Location", location.toString());
            }
        };

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){

            //Ask for permission

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        }
    }
} 

我在检查好位置的权限后,通过添加这个else语句成功解决了我的问题。

代码如下:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
 
    //Ask for permission
 
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
 
}else {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}

原因:

locationUpdate 似乎只适用于我的应用程序的第一次尝试,因为我只在 onRequestPermissionResult 代码块中设置了 locationUpdate。当我请求权限时,我的 onRequesPermissionResult 仅 运行s,到下一次我 运行 应用程序时,我已经获得了用户的许可,所以在代码中,我正在检查权限,这将 return false 因为我已经获得了权限并且我没有设置 locationUpdate 如果权限已经被授予。

所以我尝试在上面添加 else 语句。

简化问题:

  • 我第一次打开该应用程序时,我的应用程序还没有该位置的权限(ACCESS_FINE_LOCATION)。

  • 我的权限检查行将 return 为真,您请求权限。

  • onRequestPermissionResult 将 运行 并且您编写代码以在其中设置 locationUpdate 并且它起作用了。

-下次我打开应用程序时,我的应用程序已经获得了该位置的权限。

  • 我的权限检查行会return false,它不会执行作用域内的代码,所以没有请求权限被执行。

  • 我的位置没有 locationUpdate 因为 onReuqestionPermissionResult 方法没有执行。

解法:

  • 如果检查权限 returned false,我设置条件,这意味着权限已经被授予,所以我不必请求权限,只需为您的 locationManager 设置 locationUpdate。