0

これはおそらく単純で馬鹿げた問題です。私はそれに関するドキュメントを見つけることができません。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 のコンストラクターはありませ。コンストラクターなしで抽象クラスのサブクラスを作成するにはどうすればよいですか?

たとえば、これは同じエラーをスローします。

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

class mysubclass extends topabstractclass{
    mysubclass() {      
    }
}

Android の LocationProvider を変更できないため、パブリックなコンストラクターを作成できません。これは本質的にサブクラス化できないクラスですか? Android は、私たちが LocationProvider を作成することを期待していませんか? 他の LocationProvider はどのように行われますか? 誰でも例を挙げてもらえますか?

4

3 に答える 3

3

あなたの仮定は正しいです。すべてのコンストラクターが private である抽象クラスを拡張することはできません。これは、正しくは、Google が拡張を望んでいないことを意味しますLocationProvider

まず、他のプロジェクトが を複製LocationProviderする可能性があることに注意してください。次に、 it のサブクラスを作成し、必要に応じて使用できます。

さて、なぜ LocationProviderそのように制限されているのか知りたいと思います。それはドキュメントで説明されています:

各プロバイダーには、使用できる一連の基準があります。たとえば、一部のプロバイダーは、GPS ハードウェアと多数の衛星の可視性を必要とします。セルラー無線を使用したり、特定の通信事業者のネットワークやインターネットにアクセスしたりする必要があるものもあります。また、バッテリー消費特性やユーザーへの金銭的コストも異なる場合があります。Criteria クラスを使用すると、ユーザー指定の基準に基づいてプロバイダーを選択できます。

ここで、行間を少し読む必要があります。その情報のどれだけが通信事業者から直接提供され、電話固有のものであるかを考えてみてください。これは、プロバイダーが難解なルールに従っていないため、アプリで改ざんするとデバイスが機能しなくなる可能性があることを意味します。これが、Androidがすべてのプロバイダーを設定する理由です。(このリンクは、手元に置いておくと非常に便利です。独自のプロバイダーなしでその位置情報にアクセスする方法が示されています。)

したがって、いいえ、暗黙的に* extendsすることはできませんLocationProvider。キャリア、ハードウェア、およびソフトウェア間で機能するように特別に設計されているため、既存のものを使用する必要があります。

* @Funtik の回答に示されているように、署名LocationProviderを使用して拡張できます。String, ILocationManagerただし、これは文書化されておらず、 でマークされており{@hide}、以前のバージョンではサポートされていないため、正しい構築方法を取得するには、いくつかの作業が必要になる場合があります。

于 2012-09-09T06:43:00.707 に答える
1

コンストラクターがすべてプライベートであるクラスから継承できないという点で、あなたは正しいです。通常、私はそれらがpackage -private のみであることを期待します。そのため、おそらくその実装者によって作成された同じパッケージ内の他のクラスは、引き続きそれを継承できます。

ただし、Android 4.1.1 では、パブリック コンストラクターLocationProvider あるように見えます。その署名は、代わりに実装する必要があることを示唆しています。ILocationManager

バージョンを遡ると、このコンストラクタは 2.3 で追加されました。バージョン 2.2.2にはString. そのコンストラクターは 1.6 までさかのぼります。

于 2012-09-09T06:50:10.463 に答える
1

について話しているのandroid.location.LocationProviderですか?

grepcode.com によると、パブリック コンストラクターpublic LocationProvider(String name, ILocationManager service)があります。試すことができます。

于 2012-09-09T06:45:00.527 に答える