我需要在游戏中播放声音,所以我将org.apache.cordova.media插件添加到我的应用程序中。现在,platforms / android / AndroidManifest.xml包含两个我不需要的条目:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
如果删除这些行,则会重新生成此文件并再次添加权限。删除这些权限的正确方法是什么?我使用apache cordova 3.5.0
答案 0 :(得分:12)
您必须打开plugins/android.json
,找到该文件中的部分
"AndroidManifest.xml": {
"parents": {
"/*": [
......
{
"xml": "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />",
"count": 1
},
......
{
"xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
"count": 1
},
......
],
并删除这些文件。删除这些行后,请确保android.json
仍然是有效的JSON文件。
另请注意count
属性,该属性指示有多少插件使用权限。如果您的值超过1,您应该找到哪些其他插件可以使用该权限。此外,我不确定Cordova插件是否在没有适当权限的情况下经过测试可行,因此您在从该文件中删除权限时可以自行测试。
如果您将系统置于损坏状态,您始终可以删除平台和插件文件夹的所有内容,并通过运行
重新创建项目cordova create ...
cordova platform add ...
cordova plugin add ...
答案 1 :(得分:12)
在项目的根目录中创建一个文件,并将其重命名为 remove_permissions.js ,然后将以下代码放入其中:
var permissionsToRemove = [ "RECORD_AUDIO", "MODIFY_AUDIO_SETTINGS"];
var fs = require('fs');
var path = require('path');
var rootdir = "";
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 );
} );
} );
打开 config.xml 并在Android部分添加下面的行:
<platform name="android">
...
<hook type="after_prepare" src="remove_permissions.js"/>
...
</platform>
现在重建APK文件。
答案 2 :(得分:1)
@codevision的响应中的方法曾经为我工作,但在最近(我不知道截止的)版本的cordova-android平台上,我发现权限仍然存在合并到APK中的最终AndroidManifest.xml。
原因是Merge Multiple Manifest Files构建步骤导致从各种插件依赖项(包括.aar文件)声明的权限潜入最终的AndroidManifest.xml。
对我来说有用的是创建一个修改platforms/android/AndroidManifest.xml
的后准备脚本,如下所示:
<manifest>
标记xmlns:tools="http://schemas.android.com/tools"
tools:node="remove"
标记,例如: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" tools:node="remove">
这可以防止任何依赖项将其MODIFY_AUDIO_SETTINGS
权限隐藏到最终的APK中。
答案 3 :(得分:0)
我尝试了上面的答案,但清单文件不断重新生成。 我通过创建一个“after_prepare”钩子解决了这个问题,该钩子在构建过程中修改了清单文件。
代码发布在this thread。
答案 4 :(得分:0)
我认为删除不必要的插件的最佳方法
phonegap plugin remove cordova-plugin-media-capture
答案 5 :(得分:0)
@SaeedHosseinPoor 的答案有效,但脚本有点脆弱,因为它不使用 XML 解析器。这是一个替代的钩子脚本。在 Node 15、Cordova 10、cordova-android 9 上测试。
scripts/remove_permissions.js
:const fs = require('fs/promises')
const xml2js = require('xml2js')
const REMOVE_PERMISSIONS = [
'android.permission.INTERNET',
'android.permission.ACCESS_NETWORK_STATE',
]
module.exports = async function(context) {
const root = context.opts.projectRoot
const manifestPath = root + '/platforms/android/app/src/main/AndroidManifest.xml'
const manifestXml = await fs.readFile(manifestPath)
const manifest = await xml2js.parseStringPromise(manifestXml)
const usesPermissions = manifest.manifest['uses-permission']
if (Array.isArray(usesPermissions)) {
manifest.manifest['uses-permission'] = usesPermissions.filter(usesPermission => {
const attrs = usesPermission.$ || {}
const name = attrs['android:name'] // Assuming xmlns:android has been set as usual...
if (REMOVE_PERMISSIONS.includes(name)) {
console.log(`Removing permission "${name}" from AndroidManifest.xml`)
return false
} else {
return true
}
})
}
const newManifest = (new xml2js.Builder()).buildObject(manifest)
await fs.writeFile(manifestPath, newManifest)
}
运行 npm add --save-dev xml2js
。
将钩子添加到 config.xml
:
<platform name="android">
...
<hook type="after_prepare" src="scripts/remove_permissions.js"/>
</platform>