2

私はandriodのFused Location APIを使用して場所(緯度/経度)を取得しようとしています。 wifiとgpsの両方がオンのとき、私のコードは正常に動作します。私はGPSをオフにする場合、私は場所の更新を取得しません。

ロケーションリクエストにBALANCED_POWER_ACCURACYを使用しています。 私は、マニフェストにAccess_FINE_Location権限を追加しました。また、私のbuild.gradleファイルでプレイサービスバージョン9.2.1を使用しています。
私は実際のデバイス(Samsung SM0G360H API 19とSamsung SM-G361 API 21)でテストしています。両方とも同じ結果が得られます。
融合ロケーションApiがどのように正確に機能するか教えていただけますか?
gpsがオフでネットワーク接続がオンの場合、どのように位置情報を取得できますか?
マイコード:
ネットワークを使用してアンドロイドの融合ロケーションプロバイダを使用して位置を取得する方法は?

public class LocationUpdateusingFused extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener{ 



TextView txtOutputLat, txtOutputLon; 
Location mLastLocation; 
private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 
String lat, lon; 

Intent batteryStatus; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fleet_layout); 

    txtOutputLat = (TextView) findViewById(R.id.textView); 
    txtOutputLon = (TextView) findViewById(R.id.textView2); 


    buildGoogleApiClient(); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    mLocationRequest.setMaxWaitTime(5000); 
    mLocationRequest.setInterval(10000); // Update location every second 

    try { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
    } 
    catch (SecurityException e) 
    { 
     Log.e("LocatonUpdate",e+" "); 
    } 
    if (mLastLocation != null) { 
     lat = String.valueOf(mLastLocation.getLatitude()); 
     lon = String.valueOf(mLastLocation.getLongitude()); 

    } 
    updateUI(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    lat = String.valueOf(location.getLatitude()); 
    lon = String.valueOf(location.getLongitude()); 
    Log.e("LocationChanged",location.getSpeed()+" "+location.getAccuracy()+" "+location.getBearing()+" "+location.getProvider()+" "+location.getAltitude() 
    ); 

    updateUI(); 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    buildGoogleApiClient(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mGoogleApiClient.disconnect(); 
} 
void updateUI() { 
    txtOutputLat.setText(lat); 
    txtOutputLon.setText(lon); 
} 
synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 


} 

}

+0

位置の設定を確認しましたか?また、setInterval(10000)は10秒です。それは重要ではない。 – masp

+0

場所の設定について言及してくれてありがとうございますが、ネットワークを使用している場所の更新のみを取得したい、つまり位置情報サービスがオフになっています。私は通常のLocationServiceを使用してこれを行うことができましたが、融合したプロバイダは位置情報サービスをオフにしていません。あなたは私にこれに関する情報を教えてもらえますか? – Alvi

+0

位置情報サービスを無効にしましたか?なぜあなたの21のサムに正確に設定されていますか?アプリがgpsを使用しないようにするには、アクセス権を変更してACCESS_COARSE_LOCATIONだけを使用できます。 PRIORITY_BALANCED_POWER_ACCURACYを指定して融合プロバイダを使用することはできます。まず、アルゴリズムはネットワークプロバイダをチェックし、利用可能であればgpsに進みます。 – masp

答えて

2

あなたの質問に答えることを試みることにかなり長時間の遅延のため申し訳ありません。私は自分自身の位置の問題全体と戦ってきたので、私は気づき、「多くの苦難」の後で学んだことをあなたに提供します。あなたはまだ種類の答えが必要ですか?

APIレベル19の設定がどのようになっているのかは分かりませんが、一般的に、API lvl 15以降のすべてのロケーション設定は、FusedLocationProviderAPIロジックに準拠するように設定されています。それが私の言うことは、 HAVEは、設定/切り替えが一般的な位置を制御するため、あらゆる種類の位置更新を得るために常に位置設定をオンにする必要があります。うまくいけば、これはあなたの主な質問に答えます。

さらに詳しい情報を提供します。コメントの1つにmaspが記述されているので、Fused Location APIのパーミッションと定数によってプロバイダが実際に使用するものを制御できます。

ACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATIONのいずれかを選択する必要があります。違いは、(I quote)です:

あなたはNETWORK_PROVIDERとGPS_PROVIDERの両方を使用している場合は、それが両方のプロバイダのアクセス許可が含まれているため、唯一ACCESS_FINE_LOCATIONの許可を要求する必要があります。 ACCESS_COARSE_LOCATIONの許可により、NETWORK_PROVIDERへのアクセスのみが許可されます。

そして、私たちはFusedLocationProviderAPI constantsを持っています。物事は少し複雑になります。あなたはモードを入力した場合、あなたが得る

enter image description here

enter image description here

私は定数に多くを行くことはありません。また、API 21 LVLとアップから我々はこれを持っています。彼らはこのquestionの受け入れられた答えでテストされています。私はあなたがガンダーを持っていることをお勧めします。しかし、あなたが何をしていても、設定のモードが優先されることに言及する必要があります。あなたはアプリでGPSを尋ねることができますが、ユーザーが設定でバッテリー節約を言うなら、それはそうです。

あなたがACCESS_COARSE_LOCATIONへのアクセス許可を設定した場合、恐ろしい精度が予想されます(上記のテストにも示されています)。私の提案は、ACCESS_FINE_LOCATIONを使用して、融合位置定数と間隔(setIntervalsetFastestInterval)を使用して再生することです。

これは遅くてもちょっと役立ちます。

関連する問題