Ionic 始终允许定位 API 级别 29
Ionic Allow location all the time API level 29
我正在尝试在我的 ionic 应用程序上使用 API 级别 29,并且我要求该应用程序询问用户“始终允许”位置。我已经添加了所有建议的修改。
我的AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION">
<uses-permission android:name="android.permission.PERMISSION.FOREGROUND_SERVICE">
我的app.component.ts:
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this.setProviders();
this.checkBackgroundPermission();
});
}
private async checkBackgroundPermission() {
try {
const result = await this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION);
if (!result || result.hasPermission === false) {
this.requestPermissions();
}
} catch (error) {
this.requestPermissions();
}
}
private async requestPermissions() {
try {
const data = await this.androidPermissions.requestPermissions([
this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION,
this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION,
this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
this.androidPermissions.PERMISSION.ACTIVITY_RECOGNITION,
this.androidPermissions.PERMISSION.FOREGROUND_SERVICE
]);
if (!data.hasPermission) {
throw new Error('No permission');
}
} catch (error) {
await this.alertService.showAlert(
'Background location',
'We need background location access in order to continue.'
);
this.signOut();
}
然而,当我定位 Api 级别 29 时,它不会一直显示允许位置的请求。
但是如果我使用 Api 级别 28 它显示我需要的权限
有什么建议可以使这项工作有效吗?
在您为 ACCESS_BACKGROUND_LOCATION 调用检查权限的地方,还要检查 ACCESS_FINE_LOCATION,如果没有找到,请调用您的 requestPermissions 方法。这应该有所帮助。
我遇到了完全相同的问题。以下对我有用。
- 使用AndroidPermissions 请求以下权限。
const data = await this.androidPermissions.requestPermissions([
"android.permission.ACCESS_BACKGROUND_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION",
this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
]);
注意字符串 "android.permission.ACCESS_BACKGROUND_LOCATION"
,而不是 this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION
,它在运行时实际上是未定义的。我的猜测是 ACCESS_BACKGROUND_LOCATION
权限在 AndroidPermissions
插件发布时不存在。
在后台定位之前调用requestPermissions
方法。这很重要。
将<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
添加到platforms\android\app\src\main\AndroidManifest。xml
- 将此添加到
platforms\android\app\src\main\AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Geolocation.java
文件中的更改(地理定位插件)
- 删除:
String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }
- 替换为:
String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION };
我正在尝试在我的 ionic 应用程序上使用 API 级别 29,并且我要求该应用程序询问用户“始终允许”位置。我已经添加了所有建议的修改。
我的AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION">
<uses-permission android:name="android.permission.PERMISSION.FOREGROUND_SERVICE">
我的app.component.ts:
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
this.setProviders();
this.checkBackgroundPermission();
});
}
private async checkBackgroundPermission() {
try {
const result = await this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION);
if (!result || result.hasPermission === false) {
this.requestPermissions();
}
} catch (error) {
this.requestPermissions();
}
}
private async requestPermissions() {
try {
const data = await this.androidPermissions.requestPermissions([
this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION,
this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION,
this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
this.androidPermissions.PERMISSION.ACTIVITY_RECOGNITION,
this.androidPermissions.PERMISSION.FOREGROUND_SERVICE
]);
if (!data.hasPermission) {
throw new Error('No permission');
}
} catch (error) {
await this.alertService.showAlert(
'Background location',
'We need background location access in order to continue.'
);
this.signOut();
}
然而,当我定位 Api 级别 29 时,它不会一直显示允许位置的请求。
但是如果我使用 Api 级别 28 它显示我需要的权限
有什么建议可以使这项工作有效吗?
在您为 ACCESS_BACKGROUND_LOCATION 调用检查权限的地方,还要检查 ACCESS_FINE_LOCATION,如果没有找到,请调用您的 requestPermissions 方法。这应该有所帮助。
我遇到了完全相同的问题。以下对我有用。
- 使用AndroidPermissions 请求以下权限。
const data = await this.androidPermissions.requestPermissions([ "android.permission.ACCESS_BACKGROUND_LOCATION", "android.permission.ACCESS_COARSE_LOCATION", this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION, ]);
注意字符串 "android.permission.ACCESS_BACKGROUND_LOCATION"
,而不是 this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION
,它在运行时实际上是未定义的。我的猜测是 ACCESS_BACKGROUND_LOCATION
权限在 AndroidPermissions
插件发布时不存在。
在后台定位之前调用
requestPermissions
方法。这很重要。将
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
添加到platforms\android\app\src\main\AndroidManifest。xml
- 将此添加到
platforms\android\app\src\main\AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Geolocation.java
文件中的更改(地理定位插件)
- 删除:
String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }
- 替换为:
String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION };