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) は信頼できないを参照してください)。 、この問題の概要について)、getLastKnownLocation
null を返し、更新を要求した後、適切な時間内に更新を受信しません (5 分待った)。
私が取っているアプローチに何か問題がありますか?必要なネットワークの場所を取得する他の方法、またはこれが機能するために必要なネットワークの場所を有効にする以外の電話の設定はありますか? より基本的なレベルでは、ここで何がうまくいかないのでしょうか?