这可能是一个简单/愚蠢的问题。我找不到任何文档。
我想在Android中创建自己的LocationProvider。 LocationProvider是一个抽象类,没有构造函数。

import android.location.LocationProvider;

public class provider extends LocationProvider {
    public provider() {
    }

    @Override
    public int getAccuracy() {
        // TODO Auto-generated method stub
        return 0;
    }

...

    @Override
    public boolean supportsSpeed() {
        // TODO Auto-generated method stub
        return false;
    }
}


Eclipse在这里给我错误:
“隐式超级构造函数LocationProvider()不可见。必须显式调用另一个构造函数”

但是当然,空的超级构造函数是不可见的-LocationProvider没有构造函数。我应该如何创建没有构造函数的抽象类的子类?

例如,这将引发相同的错误:

public abstract class topabstractclass {
    private topabstractclass() {
    }
}

class mysubclass extends topabstractclass{
    mysubclass() {
    }
}


我无法修改Android的LocationProvider,因此无法创建公共的构造函数。
这只是本质上不可细分的类吗? Android是否不希望我们曾经创建LocationProviders?其他LocationProvider如何完成?任何人都可以提供示例吗?

最佳答案

您的假设是正确的。扩展所有构造函数都是私有的抽象类是不可能的。正确地,这意味着Google不希望您扩展LocationProvider

首先,请注意其他项目可能会clone LocationProvider。然后,他们创建自己的subclasses of it,并可以根据需要使用它们。

现在,我猜您想知道为什么LocationProvider以这种方式受到限制。文档对此进行了解释:


  每个提供者都有一套可以使用它的标准;例如,某些提供商需要GPS硬件和对许多卫星的可见性;其他要求使用蜂窝无线电,或访问特定运营商的网络或互联网。它们也可能对用户具有不同的电池消耗特性或金钱成本。 Criteria类允许根据用户指定的标准选择提供者。


在这里,我们必须在两行之间阅读一点。考虑一下其中的多少信息直接来自运营商,并且是特定于电话的。这意味着在您的应用中对其进行篡改可能会阻止设备运行,因为其提供者不再遵循其深奥的规则。这就是为什么Android sets up all the providers for us。 (此链接非常易于使用。它将向您展示如何在没有您自己的提供商的情况下访问该位置信息。)

因此,不,您不能隐式*扩展LocationProvider。您必须使用已经存在的硬件,因为它们是专门设计用于在载体,硬件和软件之间工作的。

*如@Funtik的答案所示,您可以使用LocationProvider签名扩展String, ILocationManager。但是,它没有文档说明,带有{@hide}标记,并且在以前的版本中不受支持,因此您可能需要做一些调整才能获得正确的构造方法。

10-01 19:03