从CLI生成时,Cordova会向AndroidManifest.xml添加不需要的权限

从CLI生成时,Cordova会向AndroidManifest.xml添加不需要的权限,android,cordova,permissions,command-line-interface,Android,Cordova,Permissions,Command Line Interface,我使用CLI构建我的Cordova应用程序,并添加了媒体插件 “cordova build”会自动将android.permission.RECORD_音频添加到我的AndroidManifest.xml中,即使我不使用该权限 那么我如何移除它呢?每次我构建发布时,权限都会添加到apk中。在您的项目中,编辑文件plugins/org.apache.cordova.media/plugin.xml 您将看到特定于android的配置 <platform name="android"&g

我使用CLI构建我的Cordova应用程序,并添加了媒体插件

“cordova build”会自动将android.permission.RECORD_音频添加到我的AndroidManifest.xml中,即使我不使用该权限


那么我如何移除它呢?每次我构建发布时,权限都会添加到apk中。

在您的项目中,编辑文件plugins/org.apache.cordova.media/plugin.xml 您将看到特定于android的配置

   <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="Media" >
                <param name="android-package" value="org.apache.cordova.media.AudioHandler"/>
            </feature>
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.RECORD_AUDIO" />
            <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        </config-file>
...

...
像这样删除行
,不会在每次生成时添加权限


由于权限已添加到AndroidManifest.xml,您必须手动将其删除,然后在下次构建时它不应返回。

要防止插件重新添加不必要的权限,请编辑platforms/android/android.json

找到这些管路并将其拆下:

{
    "xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
    "count": 1
}
{
“xml”:“,
“计数”:1
}

请注意,这是一个“肮脏”的解决方案。在添加/更新插件后,您可能必须重复此操作。

在尝试了几个建议后失败

转到platforms\android\cordova并运行

>clean
返回到项目目录并(在windows上)运行

打开results.txt以查看具有权限的文件

从列出的所有文件中删除了对权限的提及,AudioHandler.java文件除外


做了一个构建,它成功了。最后。

我尝试了上面的建议(来自QuickFix和leuk98743),但清单文件不断被重新生成。 因此,我创建了一个钩子来在构建过程中修改清单文件

  • 将以下内容添加到项目中的文件中:
    hooks/after\u prepare/030\u remove\u permissions.js
  • 如果您在Linux上,请使该文件可执行
  • 修改文件以设置要删除的权限。我的示例中列出了3个,但您应该根据需要添加/删除
  • #/usr/bin/env节点
    //
    //此挂钩从AndroidManifest.xml中删除特定权限
    //AndroidManifest在准备阶段重新生成,
    //所以这必须在“after_prepare”钩子上运行。
    //
    //配置要强制删除的权限。
    //注意:无论有多少插件,这些权限都将被删除
    //需要许可。您可以检查仅需要的权限
    //根据您认为*需要的插件,通过查看中显示的“计数”
    //您的/plugins/android.json文件。
    //如果计数大于1,则应通过
    //的/plugins/plugin name/plugin.xml文件使用权限标记。
    var permissionsToRemove=[“录制音频”、“修改音频设置”、“读取电话状态”];
    var fs=需要('fs');
    var path=require('path');
    var rootdir=process.argv[2];
    var manifestFile=path.join(rootdir,“platforms/android/AndroidManifest.xml”);
    readFile(manifestFile,“utf8”,函数(err,data)
    {
    如果(错误)
    返回console.log(err);
    var结果=数据;
    对于(var i=0;i我做了以下工作:

  • 已从以下2个文件中删除权限项:
  • myapp\platforms\android\app\src\main\AndroidManifest.xml
    myapp\platforms\android\android.json
    

  • 在释放模式下重建apk
  • 它起作用了,删除的权限条目无法在清单文件中返回。
    已成功将apk上载到Play console。

    为那些更熟悉python的人克隆了的答案。它假定该文件将位于类似于
    hooks/after\u prepare/123\u remove\u permissions.py的位置,并且是可执行的

    !/usr/bin/env python
    导入操作系统
    script_dir=os.path.dirname(os.path.abspath(_文件__))
    project_dir=os.path.abspath(os.path.join(script_dir,“....”)
    错误的\u权限=[
    “写入外部存储”,
    “录制音频”,
    “修改音频设置”,
    ]
    android_manifest=os.path.join(project_dir'platforms/android/app/src/main/AndroidManifest.xml')
    打开(android_清单,'r')作为fr:
    行=fr.readlines()
    new_lines=[line for line in lines if not[perm for perm in bad_perm in line if perm in bad_perm perm]]
    打开(android_清单,“w”)作为fw:
    fw.writelines(新线)
    
    媒体插件添加了录制音频权限:这是正确的。正如我在原始帖子中指出的:)您需要使用插件(或在本地修改插件)从plugin.xml(上面链接中的行)中删除权限并确保您不进行任何需要此权限的调用。如果您不想分叉,您可以本地下载插件/修补它并从本地路径安装,或者直接修补项目的/plugins文件夹的plugin文件夹中的plugin.xml文件。我也这么认为。但它仍然添加了四个权限。这不是流程:1.创建应用程序并添加Android平台2.添加媒体插件3.从AndroidManifest.xml中删除权限4.从plugins/org.apache.cordova.media/plugin.xml中删除权限5.构建6.AndroidManifest.xml现在再次包含权限。即使我从cli卸载媒体插件并从mani中删除权限fest,然后再次构建,权限被放回…我分叉了插件,从github上的plugin.xml中删除了权限,然后从那里安装。这就成功了。谢谢。我不知道这个文件还包含使用权限信息。我下次会尝试。最好的办法是分叉插件存储库,尽管没有g在我的
    plugins/android.json
    中,但在
    platforms/android/android.json
    (使用
    Ionic 2
    )下找到了这样一个好主意,因为它是自动的。但是代码示例似乎已经损坏了!谢谢你让我知道。我已经修复了代码示例。谢谢这解决了我的问题:1)hooks directo
    >findstr /s /M RECORD_AUDIO *.* > results.txt