Cordova Android重复使用来自两个插件的功能

Aut*_*ico 15 android android-manifest cordova

我使用两个不同的插件到cordova,它们都有相同的uses-feature,一个有android:required="false"一个没有.

这会导致构建时出错:

processDebugManifest
/path/to/project/platforms/android/AndroidManifest.xml:31:5 Error:
    Element uses-feature#android.hardware.camera at AndroidManifest.xml:31:5 duplicated with element declared at AndroidManifest.xml:27:5
/path/to/project/platforms/android/AndroidManifest.xml:32:5 Error:
    Element uses-feature#android.hardware.camera.autofocus at AndroidManifest.xml:32:5 duplicated with element declared at AndroidManifest.xml:28:5
/path/to/project/platforms/android/AndroidManifest.xml:0:0 Error:
    Validation failed, exiting
:processDebugManifest FAILED
.....
ERROR building one of the platforms: Error: /path/to/project/platforms/android/cordova/build: Command failed with exit code 1
You may not have the required environment or OS to build this project
Run Code Online (Sandbox Code Playgroud)

编译后的清单在构建时具有以下内容:

...
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
    <uses-feature android:name="android.hardware.camera.flash" android:required="false" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
...
Run Code Online (Sandbox Code Playgroud)

有什么办法可以解决这个问题吗?


cordova版本5.4.1

小智 10

我有使用cordova-plugin-camera和phonegap-plugin-barcodescanner的理智问题.我的修复:

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
Run Code Online (Sandbox Code Playgroud)

接下来删除package.json的phonegap-plugin-barcodescanner.跑:

npm install
ionic cordova platform add android
Run Code Online (Sandbox Code Playgroud)

接下来做一个新的构建:

ionic cordova run android
Run Code Online (Sandbox Code Playgroud)

接下来再次添加插件:

ionic cordova plugin add phonegap-plugin-barcodescanner
Run Code Online (Sandbox Code Playgroud)


小智 9

1.打开插件/ [你的插件名称] /plugin.xml

2.删除此行:

`<uses-feature android:name="android.hardware.camera" android:required="false" />`
Run Code Online (Sandbox Code Playgroud)

3.重建你的项目

  • 这只是一个临时修复.任何时候我重新安装库,这个问题都会回来.我实际上对我的项目应用了类似的"修复",但我认为这是cordova中的一个问题,它不检查`uses-features`语句中的属性. (6认同)
  • 建议+1,但这应该由Cordova插件安装脚本解决.我们为多个应用程序自动化构建,这个问题打破了这个过程. (4认同)
  • 我经常遇到这个问题。即使从plugin.xml中手动删除条目也不能总是对其进行修复。即使它没有更新plugins文件夹中的内容,这就像是为构建而实时启动。非常令人沮丧。 (2认同)

Mat*_*ets 8

上述解决方案都不令人满意,因为您需要修改一些生成的输出或调整一些插件。只有“临时”修复。我们应该能够通过只修改我们的源代码来解决这个问题。

从 Cordova 6.4+ 开始,我们可以利用文件中的edit-config标签config.xml。以下解决方案也适用于 CI 和自动化构建。

它已经针对类似的场景进行了测试,其中两个cordova插件定义了相同的<uses-feature>名称:

/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
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml 片段:

    <!-- ... -->
    <uses-feature android:name="android.hardware.location.gps" android:required="true" />
    <uses-feature android:name="android.hardware.location.gps" />
    <!-- ... -->
Run Code Online (Sandbox Code Playgroud)

解决方案:

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>

Run Code Online (Sandbox Code Playgroud)

构建时,错误消失了。

因此,对于作者描述的问题,您可以尝试在 中添加以下内容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>
Run Code Online (Sandbox Code Playgroud)

  • 当尝试使用上述修复时,我收到以下错误:“无法在选择器“/manifest/uses-feature[@android:name='android.hardware.location.gps']”处从“...移植 xml” /platforms/android/app/src/main/AndroidManifest.xml”在配置安装期间您遇到过这种情况吗? (3认同)

Art*_*hur 6

  1. 除了删除plugins.xml文件中的重复行之外,还可以转到[your project] /platforms/android/android.json并删除文件中的重复行.

  2. 在再次编译项目之前重新打开命令终端.


Ash*_*win 5

以下步骤帮助我解决了这个问题:

  1. 从您的config.xml中删除重复的元素

  2. 从platform / android / android.json文件中删除重复的对象。

  3. 从platform / android / app / src / main / AndroidManifest.xml文件中删除重复的元素。

  4. 关闭您的IDE /文本编辑器(特别是在使用VS Code的情况下)。

  5. 现在运行“ cordova build android”。