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。
我正在学习如何在应用程序中使用地理定位,我遇到了这个问题,我可以在模拟 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。