1

android.permission.ACCESS_COARSE_LOCATION「ネットワーク」プロバイダーから現在の場所を取得する Android アプリを作成しようとしています (そのため、許可のみが必要です)。これは一部のデバイスでは正常に機能しますが、他のデバイスでは位置情報を更新できないようです。これが私のコードです。

onCreate では:

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    provider = LocationManager.NETWORK_PROVIDER;
    Log.v (TAG, "Finding location from provider: " + provider);
    if (CHECK_PROVIDER_ENABLED && !locationManager.isProviderEnabled (provider))
    {
        Toast.makeText (this, "Location provider disabled", Toast.LENGTH_LONG).show ();
    }
    else
    {
        try
        {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location == null)
            {
                Log.i (TAG, "getLastKnownLocation returned null, requesting updates when available");
                locationManager.requestLocationUpdates (provider, 0, 0, locationListener);
            }
            else
                locationListener.onLocationChanged (location);
        }
        catch (IllegalArgumentException e)
        {
            Log.e(TAG, "Failed to get location from provider " + provider, e);
            Toast.makeText (this, "Location provider disabled", Toast.LENGTH_LONG).show ();
        }
    }

locationListener は次のように定義されます。

private LocationListener locationListener = new LocationListener() {

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

    @Override
    public void onProviderEnabled (String provider)
    {
    }

    @Override
    public void onProviderDisabled (String provider)
    {
    }

    @Override
    public void onLocationChanged (Location location)
    {
        Toast.makeText (CarouselViewerActivity.this, "" + location.getLatitude () + ", " + location.getLongitude (), Toast.LENGTH_LONG).show ();
        Log.v(TAG, "" + location.getLatitude () + ", " + location.getLongitude ());
        locationManager.removeUpdates (this);
    }
};

機能する電話では、ここですべてが正常に機能します。CHECK_PROVIDER_ENABLED が true の場合、isProviderEnabledテストは true をgetLastKnownLocation返し、null ではなく場所を返します。更新のリクエストを強制すると、場所の詳細を含むものを受け取ります。

しかし、他の電話 (私がテストしている特定のものは、Cyanogenmod 9 を搭載した Galaxy S2 です) では、isProviderEnabledテストは false を返します (ネットワークの場所を有効にするための設定項目がオンになっているにもかかわらず - LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) は信頼できないを参照してください)。 、この問題の概要について)、getLastKnownLocationnull を返し、更新を要求した後、適切な時間内に更新を受信しません (5 分待った)。

私が取っているアプローチに何か問題がありますか?必要なネットワークの場所を取得する他の方法、またはこれが機能するために必要なネットワークの場所を有効にする以外の電話の設定はありますか? より基本的なレベルでは、ここで何がうまくいかないのでしょうか?

4

1 に答える 1

1

Android Network Provider に関連する同様の問題は、Stack Overflow で以前に報告されています。こちらを参照してください。この問題を経験した人のコンセンサスは、問題が明らかになったときにデバイスを再起動するか、Google Play Service API を利用して位置データを取得するという 2 つの回避策があることを示しています。 Android 4.0 以降の Location Manager。

于 2013-08-12T20:15:41.170 に答える