【发布时间】:2021-04-18 08:38:37
【问题描述】:
我收到此错误java.lang.AbstractMethodError: abstract method "void android.location.LocationListener.onProviderDisabled(java.lang.String)
当我打电话给locationManager.requestLocationUpdates()。我看到另一个post 的答案是覆盖一些方法,即
@Override
public void onProviderDisabled(@NonNull String provider) {}
但问题是我不能在我的项目中的任何地方覆盖它们。
为了帮助读者,我简化了代码,而不是两个类,我有一个
MainActivity:
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'
}
【问题讨论】:
-
这可能是版本冲突,即您可能正在使用具有
LocationListener实现但没有实现该抽象方法的库,因为它是使用不同版本的Android SDK 比你在 atm 上运行你的应用程序。 -
看看
AbstractMethodError在Java中的一般含义:baeldung.com/java-abstractmethoderror -
我已阅读该帖子。问题是,如果您看到我的问题顶部的链接,我会提到另一篇文章,其中说有一些未实现的方法。正如错误所暗示的那样,以及来自 baeldung 的文章,这是有道理的。但是当我尝试实现这些方法时,我就是做不到!在我的两门课中都没有
标签: java android locationmanager abstractmethoderror