選擇 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
沒有留言:
張貼留言