撮影した写真の位置情報が付いてこなかった時に現在位置を取ってきて
それを代わりに使う機能を作りました。
FusedLocationProviderがでるまでは、gps、wifi、電話といった受信機器
から開発者で切り分けていましたが
これを実装すると、どの機器からも処理を分岐させる
必要がなくなり楽に受信処理を書くことができます。
locationmanagerよりもかなり短くお手軽に書けました。
まず最初にパーミッションを付けましょう。他の
uses-permissionがついているところに適当にぶちこみます。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ・・・ ・・・ ・・・ </manifest>
リクエストを受け取る為にインスタンスを作ります。
private FusedLocationProviderClient fusedLocationClient; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //コンストラクタはthisでok fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); LocationRequest locationRequest = new LocationRequest(); locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); } getLastLocation(); } //現在地を緯度経度の形で受け取る private void getLastLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener( this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { System.out.println("asaba"); latitude = location.getLatitude(); longitute = location.getLongitude(); latLng = new LatLng(latitude, longitute); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.mapFragment); mapFragment.getMapAsync(MainActivity.this); } }); }
getLastLocation()で通信に成功した場合にlatitudeとlongituteを
取ってきます。
注意するべきは、MapFragmentの定義位置です。
onCreate内でこれを呼ぶと、mapFragmentがgetLastLocation()より
早く呼ばれてしまい、latLngがnullとなりアプリがクラッシュして
しまう点です。
必ず同じスコープ内で処理をしておきましょう。
latitudeとlongituteをSystem.out.println();で表示して
現在地が読み取れれば成功です。
リファレンスはこちら→https://developer.android.com/training/location/retrieve-current.html