gpt4 book ai didi

java - Android java.lang.AbstractMethodError on requestLocationUpdates

转载 作者:行者123 更新时间:2023-12-03 20:45:49 27 4
gpt4 key购买 nike

我收到此错误 java.lang.AbstractMethodError: abstract method "void android.location.LocationListener.onProviderDisabled(java.lang.String)

当我调用 locationManager.requestLocationUpdates() 时。我看到另一个post答案是覆盖一些方法,即

 @Override
public void onProviderDisabled(@NonNull String provider) {}

但问题是我无法在我的项目中的任何地方覆盖它们。

我已经简化了代码以帮助读者,而不是两个类我有一个

主要 Activity :

public class MainActivity extends AppCompatActivity {
LocationManager locationManager;
LocationListener locationListener = location -> Toast.makeText(MainActivity.this,location.getLatitude()+" "+location.getLongitude(),Toast.LENGTH_LONG).show();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

findViewById(R.id.button).setOnClickListener(v -> showLoc());

findViewById(R.id.button2).setOnClickListener(v -> locationManager.removeUpdates(locationListener));

}
private void showLoc(){
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 13);
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 2, locationListener);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 13) {
for (int i = 0; i < permissions.length; i++) {
if (permissions[i].equals(Manifest.permission.ACCESS_FINE_LOCATION) && grantResults[i] == PackageManager.PERMISSION_GRANTED) {
System.out.println("DEBUG Request Permissions ");
showLoc();
}
}
}
}
}

locationManager.requestLocationUpdates处抛出异常,与库版本有关。

最后这是我的build.gradle(app)

plugins {
id 'com.android.application'
}

android {
compileSdkVersion 30
buildToolsVersion "30.0.2"

defaultConfig {
applicationId "com.example.app"
minSdkVersion 25
targetSdkVersion 30
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {

implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

最佳答案

找到解决方案。在 android 10(Q) 之后,您将不再需要 LocationListener 的许多未实现的方法,例如 onProviderDisabled

但是我们的大多数应用都具有较高的向后兼容性“余量”,支持更旧的 Android 版本,因此您需要覆盖这些版本。

因此,为了实现这些,我们可以通过两种方法来实现:

第一个解决方案是创建一个新的 LocationListener 作为变量并立即实现这些方法

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull Location location) {
System.out.println("DEBUG 1");
Toast.makeText(MainActivity.this,location.getLatitude()+" "+location.getLongitude(),Toast.LENGTH_LONG).show();
}

@Override
public void onProviderEnabled(@NonNull String provider) {
System.out.println("DEBUG 2");
Toast.makeText(MainActivity.this,"onProviderEnabled",Toast.LENGTH_LONG).show();
}

@Override
public void onProviderDisabled(@NonNull String provider) {
System.out.println("DEBUG 3");
Toast.makeText(MainActivity.this,"onProviderDisabled",Toast.LENGTH_LONG).show();
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("DEBUG 4");
Toast.makeText(MainActivity.this,"onStatusChanged",Toast.LENGTH_LONG).show();

}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0.5f, locationListener);

第二种方法是在您的类中实现LocationListener 并实现这些方法

public class MainActivity extends AppCompatActivity implements LocationListener

现在你必须实现这些方法

    @Override
public void onLocationChanged(@NonNull Location location) {

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(@NonNull String provider) {

}

@Override
public void onProviderDisabled(@NonNull String provider) {

}

而你的 LocationListener 是你自己的类

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0.5f, this);

最后要记住的是,即使 public void onStatusChanged(String provider, int status, Bundle extras) {} 已弃用,您也应该实现,因为我表示使用 Android 9 或更低版本 的 Android 手机将在使用 locationManager.requestLocationUpdates

进行位置更新时触发该方法

关于java - Android java.lang.AbstractMethodError on requestLocationUpdates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65700139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com