Open ggiordan opened 3 years ago
Hi,
I met the same issue and I've found a workaround that doesn't need to update the plugin files (which was not a solution for us as we build our app from scratch in a cloud environment).
Take a look: https://stackoverflow.com/a/64995384/2118909
Obviously, it would be better if we could get rid of this workaround and could be fixed in a new bug-fix release.
@mcastets I added the following to my config.xml
file as described in your SO post:
<platform name="android">
<!-- ... -->
<edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']">
<uses-feature android:name="android.hardware.location.gps" />
</edit-config>
</platform>
But I get the following error when attempting to build the project:
The prefix "android" for attribute "android:name" associated with an element type "uses-feature" is not bound.
I wonder if there are any other steps you may have left off of your workaround?
Environment:
Ionic:
Ionic CLI : 6.12.2 (.../.nvm/versions/node/v12.19.0/lib/node_modules/@ionic/cli)
Ionic Framework : @ionic/angular 5.5.1
@angular-devkit/build-angular : 0.1100.2
@angular-devkit/schematics : 11.0.2
@angular/cli : 11.0.2
@ionic/angular-toolkit : 3.0.0
Cordova:
Cordova CLI : 10.0.0
Cordova Platforms : android 9.0.0
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 5.0.0, (and 12 other plugins)
Utility:
cordova-res : 0.15.2
native-run (update available: 1.3.0) : 1.2.2
System:
Android SDK Tools : 26.1.1 (.../Library/Android/sdk/)
NodeJS : v12.19.0 (.../.nvm/versions/node/v12.19.0/bin/node)
npm : 6.14.8
OS : macOS Catalina
Xcode : Xcode 12.2 Build version 12B45b
@SimonBrazell I didn't encounter your issue.
Have you considered reinstalling the android platform? No related warning during cordova prepare?
Could you copy and paste your generated AndroidManifest.xml
(located in platforms/android/app/src
folder) without the config.xml
workaround? (or at least your <uses-feature />
tags).
Could you then confirm that you have the following lines (the xmlns:android
namespace on the manifest tag seems important):
<?xml version='1.0' encoding='utf-8'?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- other tags here -->
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
<uses-feature android:name="android.hardware.location" />
<uses-feature android:name="android.hardware.location.gps" />
</manifest>
If you don't have the xmlns:android
namespace, you might want to add it to your config.xml
(as an attribute of the <widget>
tag). Mine looks like this:
<?xml version="1.0" encoding="utf-8" ?>
<widget xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0" android-versionCode="1" id="com.yourid" ios-CFBundleVersion="1" version="1.0.0" xmlns="http://www.w3.org/ns/widgets">
<!-- other tags here -->
Hi @mcastets thanks for responding.
I tried reinstalling the platform i.e. cordova platform rm android
, still get the same error.
AndroidManifest.xml
looks like this when I don't include your edit-config
solution:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10001" android:versionName="1.0.0" package="..." xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="${applicationId}.cordova.plugin.camera.provider" android:exported="false" android:grantUriPermissions="true" android:name="org.apache.cordova.camera.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths" />
</provider>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="${GOOGLE_MAPS_ANDROID_API_KEY}" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<uses-library android:name="org.apache.http.legacy" android:required="false" />
<provider android:authorities="${applicationId}.localnotifications.provider" android:exported="false" android:grantUriPermissions="true" android:name="de.appplant.cordova.plugin.notification.util.AssetProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/localnotification_provider_paths" />
</provider>
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.TriggerReceiver" />
<receiver android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.ClearReceiver" />
<service android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.ClickReceiver" />
<receiver android:directBootAware="true" android:exported="false" android:name="de.appplant.cordova.plugin.localnotification.RestoreReceiver">
<intent-filter>
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<amazon:enable-feature android:name="com.amazon.device.messaging" android:required="false" xmlns:amazon="http://schemas.amazon.com/apk/res/android" />
<service android:exported="false" android:name="com.onesignal.ADMMessageHandler" />
<receiver android:name="com.onesignal.ADMMessageHandler$Receiver" android:permission="com.amazon.device.messaging.permission.SEND">
<intent-filter>
<action android:name="com.amazon.device.messaging.intent.REGISTRATION" />
<action android:name="com.amazon.device.messaging.intent.RECEIVE" />
<category android:name="..." />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-feature android:name="android.hardware.location" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.amazon.device.messaging.permission.RECEIVE" />
<permission android:name="....permission.RECEIVE_ADM_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="....permission.RECEIVE_ADM_MESSAGE" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
</manifest>
When I do include the edit-config
snippet it only gets this far:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10001" android:versionName="1.0.0" package="..." xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@mcastets I was able to resolve the issue by downgrading the cordova-plugin-geolocation
to 4.0.2
, it appears the issue only arrises in the latest version (4.1.0
).
You are running 4.1.0
right? If so it's strange that you were able to resolve it while I wasn't.
@SimonBrazell Sorry, but I'm quite busy this week. But, I really would like to be helpful and make some experiments to understand your case and find a solution.
You're right, I'm running 4.1.0
so that's really weird.
All good @mcastets, I think pinning the geolocation plugin to the previous version is enough for me for now, although I still need to test this on a device, I appreciate your efforts regardless.
Cheers!
downgrading the cordova-plugin-geolocation to 4.0.2 worked for me... Awesome. Thank you @SimonBrazell
this worked with me
<platform name="android">
.....
<edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature android:name="android.hardware.location.gps" />
</edit-config>
</platform>
@mcastets I added the following to my
config.xml
file as described in your SO post:<platform name="android"> <!-- ... --> <edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']"> <uses-feature android:name="android.hardware.location.gps" /> </edit-config> </platform>
But I get the following error when attempting to build the project:
The prefix "android" for attribute "android:name" associated with an element type "uses-feature" is not bound.
I wonder if there are any other steps you may have left off of your workaround?
Environment:
Ionic: Ionic CLI : 6.12.2 (.../.nvm/versions/node/v12.19.0/lib/node_modules/@ionic/cli) Ionic Framework : @ionic/angular 5.5.1 @angular-devkit/build-angular : 0.1100.2 @angular-devkit/schematics : 11.0.2 @angular/cli : 11.0.2 @ionic/angular-toolkit : 3.0.0 Cordova: Cordova CLI : 10.0.0 Cordova Platforms : android 9.0.0 Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 5.0.0, (and 12 other plugins) Utility: cordova-res : 0.15.2 native-run (update available: 1.3.0) : 1.2.2 System: Android SDK Tools : 26.1.1 (.../Library/Android/sdk/) NodeJS : v12.19.0 (.../.nvm/versions/node/v12.19.0/bin/node) npm : 6.14.8 OS : macOS Catalina Xcode : Xcode 12.2 Build version 12B45b
u have to define xmlns:android="http://schemas.android.com/apk/res/android"
Try this
<platform name="android">
.....
<edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
</edit-config>
....
</platform>
Try this
<platform name="android"> ..... <edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-feature android:name="android.hardware.location.gps" android:required="true" /> </edit-config> .... </platform>
It fails. But @mostafa-mansour1 solution works correctly:
<platform name="android"> ..... <edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.location.gps']" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-feature android:name="android.hardware.location.gps" /> </edit-config> </platform>
Thanks!!
Hey everyone,
Thanks for posting your solutions! After trying all the solutions above, I was still getting the same error. The only way I could solve it and get it to build was by following the script solution here. Thought it might help someone else.
Thanks @mostafa-mansour1 Your solutions works for me
I'm submitting a ... (check one with "x")
OS: (check one with "x")
cordova information: (run
$> cordova plugin list
)Current behavior: Build fails with the following error:
Expected behavior: Clean build
Solution: Not using the geolocation plugin does not work for me. My app needs the ability to watch user's the location.
The solution is straight forward, the issue is that the merge process needs the lines for to match.
To resolve I did the following to plugin.xml: 1) line 130 add:
<preference name="GPS_REQUIRED" default="true"/>
2) line 253 change<uses-feature android:name="android.hardware.location.gps" />
to be<uses-feature android:name="android.hardware.location.gps" android:required="$GPS_REQUIRED"/>
This way, the 2 plugins will move in sync with each other on the requirement for GPS. Another option would be to simply add the
android:required="true"
to line 253. I think the former solution is a bit better, as the GPS is only required if the user wants to use getlocation and show the map dot (granted that's most folks, but true is the default anyway).Support this plugin activity
I appreicate if you give me a beer :beer: from here