選擇 Angular
切換到專案目錄 cd ionicGPS
在這裡,我們將創建一個新的Ionic 4應用程序,該應用程序將包含三個插件,這些插件將有助於提供用戶更加友好的行為。
cordova-plugin-android-permissions:
通過顯示權限對話框來獲取權限。我們將使用此插件來獲取 Geolocation 訪問權限,但這可用於任何類型的權限。
$ ionic cordova plugin add cordova-plugin-android-permissions $ npm install @ionic-native/android-permissions
cordova-plugin-request-location-accuracy:
向用戶顯示一個對話框,以打開我們在下圖中顯示的 GPS,這樣用戶無需離開應用程序或進行設置。
$ ionic cordova plugin add cordova-plugin-request-location-accuracy $ npm install @ionic-native/location-accuracy
cordova-plugin-geolocation:
最後,在獲得位置訪問權限並打開設備GPS之後,我們將使用此Geolocation插件獲取準確的設備Geolocation坐標。
$ ionic cordova plugin add cordova-plugin-geolocation $ npm install @ionic-native/geolocation
接下來,我們需要將這些插件注入app.module.ts文件中,然後添加到 provider 數組中
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { RouteReuseStrategy } from '@angular/router'; import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; import { SplashScreen } from '@ionic-native/splash-screen/ngx'; import { StatusBar } from '@ionic-native/status-bar/ngx'; import { AppComponent } from './app.component'; import { AppRoutingModule } from './app-routing.module'; import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; import { Geolocation } from '@ionic-native/geolocation/ngx'; import { LocationAccuracy } from '@ionic-native/location-accuracy/ngx'; @NgModule({ declarations: [AppComponent], entryComponents: [], imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], providers: [ StatusBar, SplashScreen, AndroidPermissions, Geolocation, LocationAccuracy, { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } ], bootstrap: [AppComponent] }) export class AppModule {}
現在,我們將在應用程序的home組件中使用它們。在home.component.ts文件中,我們將添加以下方法。
通過調用以下方法checkGPSPermission()檢查應用程序是否具有訪問設備位置的權限
//Check if application having GPS access permission checkGPSPermission() { this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION).then( result => { if (result.hasPermission) { //If having permission show 'Turn On GPS' dialogue this.askToTurnOnGPS(); } else { //If not having permission ask for permission this.requestGPSPermission(); } }, err => { alert(err); } ); }
如果沒有,那麼我們將調用requestGPSPermission()方法來從用戶那裡即時獲取位置許可。
requestGPSPermission() { this.locationAccuracy.canRequest().then((canRequest: boolean) => { if (canRequest) { console.log("4"); } else { //Show 'GPS Permission Request' dialogue this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION) .then( () => { // call method to turn on GPS this.askToTurnOnGPS(); }, error => { //Show alert if user click on 'No Thanks' alert('requestPermission Error requesting location permissions ' + error) } ); } }); }
如果應用程序具有位置訪問權限,則我們將調用askToTurnOnGPS()方法。這是我們在這裡使用的方法😛此GPS顯示應用程序中的開啟對話
askToTurnOnGPS() { this.locationAccuracy.request(this.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY).then( () => { // When GPS Turned ON call method to get Accurate location coordinates this.getLocationCoordinates() }, error => alert('Error requesting location permissions ' + JSON.stringify(error)) ); }
用戶成功打開GPS後,我們將調用getLocationCoordinates()方法來獲取設備的準確位置。
// Methos to get device accurate coordinates using device GPS getLocationCoordinates() { this.geolocation.getCurrentPosition().then((resp) => { this.locationCoords.latitude = resp.coords.latitude; this.locationCoords.longitude = resp.coords.longitude; this.locationCoords.accuracy = resp.coords.accuracy; this.locationCoords.timestamp = resp.timestamp; }).catch((error) => { alert('Error getting location' + error); }); }
添加上述方法後,我們完整的Home Component ts文件將如下所示:
import { Component } from '@angular/core'; import { AndroidPermissions } from '@ionic-native/android-permissions/ngx'; import { Geolocation } from '@ionic-native/geolocation/ngx'; import { LocationAccuracy } from '@ionic-native/location-accuracy/ngx'; @Component({ selector: 'app-home', templateUrl: 'home.page.html', styleUrls: ['home.page.scss'] }) export class HomePage { locationCoords: any; timetest: any; constructor( private androidPermissions: AndroidPermissions, private geolocation: Geolocation, private locationAccuracy: LocationAccuracy ) { this.locationCoords = { latitude: "", longitude: "", accuracy: "", timestamp: "" } this.timetest = Date.now(); } //Check if application having GPS access permission checkGPSPermission() { this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION).then( result => { if (result.hasPermission) { //If having permission show 'Turn On GPS' dialogue this.askToTurnOnGPS(); } else { //If not having permission ask for permission this.requestGPSPermission(); } }, err => { alert(err); } ); } requestGPSPermission() { this.locationAccuracy.canRequest().then((canRequest: boolean) => { if (canRequest) { console.log("4"); } else { //Show 'GPS Permission Request' dialogue this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION) .then( () => { // call method to turn on GPS this.askToTurnOnGPS(); }, error => { //Show alert if user click on 'No Thanks' alert('requestPermission Error requesting location permissions ' + error) } ); } }); } askToTurnOnGPS() { this.locationAccuracy.request(this.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY).then( () => { // When GPS Turned ON call method to get Accurate location coordinates this.getLocationCoordinates() }, error => alert('Error requesting location permissions ' + JSON.stringify(error)) ); } // Methos to get device accurate coordinates using device GPS getLocationCoordinates() { this.geolocation.getCurrentPosition().then((resp) => { this.locationCoords.latitude = resp.coords.latitude; this.locationCoords.longitude = resp.coords.longitude; this.locationCoords.accuracy = resp.coords.accuracy; this.locationCoords.timestamp = resp.timestamp; }).catch((error) => { alert('Error getting location' + error); }); } }
在Home組件的HTML模板中,我們只有一個按鈕,該按鈕將調用checkGPSPermission方法,該方法已添加到上面的ts文件中,並且還顯示了收到的地理位置坐標。
< ion-grid fixed> < ion-row> < ion-col text-center> < ion-button (click)="checkGPSPermission()"> Request GPS Accuracy < /ion-button> < /ion-col> < /ion-row> < ion-row> < ion-col size="4">Longitude< /ion-col> < ion-col> {{locationCoords.longitude}}< /ion-col> < /ion-row> < ion-row> < ion-col size="4">Latitude< /ion-col> < ion-col>{{locationCoords.latitude}}< /ion-col> < /ion-row> < ion-row> < ion-col size="4">Accuracy< /ion-col> < ion-col>{{locationCoords.accuracy}}< /ion-col> < /ion-row> < ion-row> < ion-col size="4">Timestamp< /ion-col> < ion-col>{{locationCoords.timestamp | date:'medium'}}< /ion-col> < /ion-row> < /ion-grid>
修改 index.html
< !doctype html> < html lang="en"> < head> < meta charset="utf-8" /> < title>ionic app< /title> < base href="./" /> < meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> < meta name="format-detection" content="telephone=no" /> < meta name="msapplication-tap-highlight" content="no" /> < link rel="icon" type="image/png" href="assets/icon/favicon.png" /> < !-- add to homescreen for ios --> < meta name="apple-mobile-web-app-capable" content="yes" /> < meta name="apple-mobile-web-app-status-bar-style" content="black" /> < script type="text/javascript" src="cordova.js">< /script> < /head> < body> < app-root>< /app-root> < /body> < /html>
就是這樣,在上面的教程中,我們了解瞭如何在為應用程序提供地理定位權限後打開設備GPS來更準確地獲取用戶設備的地理定位權限。
以下是 Android 及 IOS 的發佈建置參考指令:
創建 Android 應用
使用ionic tool 創建,測試,運行你的apps
$ cd myApp
$ ionic cordova platform add android
$ ionic cordova build android
$ ionic cordova emulate android
創建IOS應用
$ cd myApp
$ ionic cordova platform add ios
$ ionic build ios
$ ionic emulate ios
如果出現"ios-sim was not found."錯誤,可以執行以下命令:
npm install -g ios-sim
創建電腦應用
在電腦執行出現異常,提示: cordova_not_available
解法是新增一平台為browser
ionic cordova platform add browser
再以下列指令取代ionic serve即可
ionic cordova run browser
沒有留言:
張貼留言