我使用CLI构建我的Cordova应用程序,并添加了Media插件。
' cordova build'自动将android.permission.RECORD_AUDIO添加到我的AndroidManifest.xml中,即使我没有使用该权限。
那么如何删除它?每次构建发布时,权限都会添加到apk中。
答案 0 :(得分:8)
在您的项目中,编辑文件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>
...
删除这样的行<uses-permission android:name="android.permission.RECORD_AUDIO" />
,每次构建时都不会添加权限。
由于权限已经添加到AndroidManifest.xml中,您必须手动删除它,然后下次构建时不会再回来。
答案 1 :(得分:6)
让插件不再重新添加不必要的权限编辑平台/ android / android.json。
找到这些行并将其删除:
{
"xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
"count": 1
}
请注意,这是一个“脏”的解决方案。添加/更新插件后,您可能需要重复此操作。
答案 2 :(得分:4)
我已尝试过上述建议(来自QuickFix和leuk98743),但清单文件不断重新生成。 所以我创建了一个钩子来在构建期间修改清单文件。
hooks/after_prepare/030_remove_permissions.js
#!/usr/bin/env node
//
// This hook removes specific permissions from the AndroidManifest.xml
// The AndroidManifest is re-generated during the prepare stage,
// so this must be run on the "after_prepare" hook.
//
// Configure the permissions to be forcefully removed.
// NOTE: These permissions will be removed regardless of how many plugins
// require the permission. You can check the permission is only required
// by the plugin you *think* needs it, by looking at the "count" shown in
// your /plugins/android.json file.
// If the count is more than 1, you should search through
// the /plugins/<plugin-name>/plugin.xml files for <uses-permission> tags.
var permissionsToRemove = [ "RECORD_AUDIO", "MODIFY_AUDIO_SETTINGS", "READ_PHONE_STATE" ];
var fs = require('fs');
var path = require('path');
var rootdir = process.argv[2];
var manifestFile = path.join(rootdir, "platforms/android/AndroidManifest.xml");
fs.readFile( manifestFile, "utf8", function( err, data )
{
if (err)
return console.log( err );
var result = data;
for (var i=0; i<permissionsToRemove.length; i++)
result = result.replace( "<uses-permission android:name=\"android.permission." + permissionsToRemove[i] + "\" />", "" );
fs.writeFile( manifestFile, result, "utf8", function( err )
{
if (err)
return console.log( err );
} );
} );
答案 3 :(得分:1)
我已经完成以下操作:
myapp\platforms\android\app\src\main\AndroidManifest.xml
myapp\platforms\android\android.json
它起作用了,删除的权限条目dint再次出现在清单文件中。
已成功将apk上传到Play控制台。
答案 4 :(得分:0)
尝试多次建议失败后
。
转到平台\ android \ cordova并运行
>clean
回到项目目录并(在Windows上)运行
>findstr /s /M RECORD_AUDIO *.* > results.txt
打开results.txt以查看具有权限的文件
删除了除AudioHandler.java文件之外列出的所有文件的权限。
构建是否有效。最后。
答案 5 :(得分:0)
Steve-e-b的答案的克隆版本,供那些更熟悉python的人使用。假定文件将位于hooks/after_prepare/123_remove_permissions.py
之类的位置并且可以执行。
#!/usr/bin/env python
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
project_dir = os.path.abspath(os.path.join(script_dir, '../..'))
bad_permissions = [
'WRITE_EXTERNAL_STORAGE',
'RECORD_AUDIO',
'MODIFY_AUDIO_SETTINGS',
]
android_manifest = os.path.join(project_dir, 'platforms/android/app/src/main/AndroidManifest.xml')
with open(android_manifest, 'r') as fr:
lines = fr.readlines()
new_lines = [line for line in lines if not [perm for perm in bad_permissions if perm in line]]
with open(android_manifest, 'w') as fw:
fw.writelines(new_lines)