I am using two different plugins into cordova, which both have the same uses-feature
, one with android:required=\"false\"
and one without.
This is how it finally worked for us in our Ionic 3
project. You should remove one of the duplicate entries from platforms/android/AndroidManifest.xml
:
<manifest ...>
...
<uses-feature android:name="android.hardware.camera"/>
...
<uses-feature android:name="android.hardware.camera" android:required="true" />
</manifest>
And also from platforms/android/android.json
:
{
"xml": "<uses-feature android:name=\"android.hardware.camera\" />",
"count": 1
},
...
{
"xml": "<uses-feature android:name=\"android.hardware.camera\" android:required=\"true\" />",
"count": 1
}
PS: We do this tweak only when adding the Android platform, not at every build.
The following steps helped me solve this problem:
Remove duplicate elements from your config.xml
Remove duplicate objects from platform/android/android.json file.
Remove duplicate elements from platform/android/app/src/main/AndroidManifest.xml file.
Close your IDE/Text Editor (Specially if you are using VS Code).
Now run 'cordova build android'.
1.Open plugins/[your plugin name]/plugin.xml
2.remove this line:
`<uses-feature android:name="android.hardware.camera" android:required="false" />`
3. rebuild your project
simple cmd for your problem:
cordova clean
cordova build
I had the sane issue with cordova-plugin-camera and phonegap-plugin-barcodescanner. My fix:
ionic cordova platform rm android
ionic cordova platform rm ios
ionic cordova plugin rm phonegap-plugin-barcodescanner
rm -r plugins
rm -r node_modules
rm package-lock.json
Next remove the phonegap-plugin-barcodescanner of the package.json. Run:
npm install
ionic cordova platform add android
Next do a new build:
ionic cordova run android
Next add the plugin again:
ionic cordova plugin add phonegap-plugin-barcodescanner
None of the above solutions were satisfying because you need to modify some generated output or tweak some plugins. There are only "temporary" fixes. We should be able to solve this issue by only modifying our source code.
Since Cordova 6.4+, we can take advantage of the edit-config
tag in the config.xml
file. The following solution is also great for CI and automated builds.
It has been tested for a similar scenario where two cordova plugins defined the same <uses-feature>
name:
/Users/me/dev/wkspace/project/cordova/platforms/android/app/src/main/AndroidManifest.xml:55:5-66 Error:
Element uses-feature#android.hardware.location.gps at AndroidManifest.xml:55:5-66 duplicated with element declared at AndroidManifest.xml:50:5-90
/Users/me/dev/wkspace/project/cordova/platforms/android/app/src/main/AndroidManifest.xml Error:
Validation failed, exiting
AndroidManifest.xml
snippet:
<!-- ... -->
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" />
<!-- ... -->
Solution:
Within config.xml
:
<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>
When building, errors are gone.
So, as for the issue described by author, you could try to add the following in the config.xml
:
<edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.camera']">
<uses-feature android:name="android.hardware.camera" />
</edit-config>
<edit-config file="app/src/main/AndroidManifest.xml" mode="overwrite" target="/manifest/uses-feature[@android:name='android.hardware.camera.autofocus']">
<uses-feature android:name="android.hardware.camera.autofocus" />
</edit-config>