Androidアプリで端末の位置情報を取得する

#はじめに
Androidアプリで、Cordovaプラグインを使用して端末の位置情報を取得する。

#コード
最終的なコード

```typescript
document.addEventListener("deviceready", function(){

  let permissions = window.cordova.plugins.permissions;
  permissions.requestPermissions(
    [
      permissions.ACCESS_FINE_LOCATION
      ,permissions.ACCESS_COARSE_LOCATION
    ]
    ,function( status ){
      if( status.hasPermission ){
        navigator.geolocation.getCurrentPosition(
          function(position) {
            let latitude = position.coords.latitude
            let longitude = position.coords.longitude
            console.log(latitude, longitude)
          },
          function(error) {
            console.log(error)
          },
          {
            enableHighAccuracy: false,
            timeout: 30000,
          }
        );
      }
      else{
        console.log('status of permissions is error')
      }
    }
    ,function(){
       console.log('permissions is error')
    }
  );

}, false);
```

#解説
###Cordovaの読み込みが完了した後で、中の関数を実行する。
https://cordova.apache.org/docs/ja/latest/cordova/events/events.deviceready.html

```typescript
document.addEventListener("deviceready", function(){
  ....
}, false);
```

###端末で位置情報取得を許可する。
アプリを開いた時に、「~~~に位置情報へのアクセスを許可しますか」という旨の確認ダイアログを表示させる。
`cordova-plugin-android-permissions`をインストール。

```
cd src-cordova
cordova plugin add cordova-plugin-android-permissions
```

複数のパーミッションをリクエストするため、`permissions.requestPermissions`を使用。
`permissions.ACCESS_FINE_LOCATION`は、おおよその位置にアクセスできるようにする設定。
`permissions.ACCESS_COARSE_LOCATION`は、正確な場所にアクセスできるようにする設定。

```typescript

let permissions = window.cordova.plugins.permissions;

permissions.requestPermissions(
  [
    permissions.ACCESS_FINE_LOCATION
    ,permissions.ACCESS_COARSE_LOCATION
  ]
  ,function( status ){
    if( status.hasPermission ){
      ....
    }
    else{
      ....
    }
  }
  ,function(){
    ....
  }
);

```

app/AndroidManifest.xmlに下記を追加する。

```html
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
```

###geolocationプラグインをインストール。

```
cordova plugin add cordova-plugin-geolocation

// 古いバージョンのCordovaはこっちをインストール（5.0未満？）
cordova plugin add org.apache.cordova.geolocation
```
app/res/xml/config.xmlに下記を設定する。

```html
<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.GeoBroker" />
</feature>
```

###位置情報を取得する。
`navigator.geolocation.getCurrentPosition`を使う。

```typescript
navigator.geolocation.getCurrentPosition(
  function(position) {
    let latitude = position.coords.latitude
    let longitude = position.coords.longitude
    console.log(latitude, longitude)
  },
  function(error) {
    console.log(error)
  },
  {
    enableHighAccuracy: false,
    timeout: 30000,
  }
);
```
`enableHighAccuracy`はより正確な位置情報を取得するためのオプション。
通常はtrueで設定するが、アプリの起動が遅くなる場合はfalseにすると早くなる。
falseでもほぼ正確な位置情報を取得できる。


#参考サイト
https://www.npmjs.com/package/cordova-plugin-android-permissions

https://developer.android.com/reference/android/Manifest.permission.html?hl=zh-tw

https://cordova.apache.org/docs/ja/3.1.0/cordova/geolocation/geolocation.html

https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-geolocation/

https://syncer.jp/how-to-use-geolocation-api