Skip to content

Instantly share code, notes, and snippets.

@likerRr
Last active August 21, 2020 18:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save likerRr/db6d4d1faa73c38201787c4098cfeacd to your computer and use it in GitHub Desktop.
Save likerRr/db6d4d1faa73c38201787c4098cfeacd to your computer and use it in GitHub Desktop.
Add permissions to AndroidManifest.xml with cordova hook for Ionic 2
/*
This script uses as a cordova hook and provides ability to add android permissions to AndroidManifest.xml on the fly. It also
checks and computes which of provided permissions are already added and didn't rewrite AndroidManifest.xml if no permissions provided.
Executes only for android platform.
Prerequirements:
- node 4.2+
- npm modules: lodash, xml2js
Distributed under the MIT license.
Author https://github.com/likerRr.
*/
// create a file 020_add_android_permissions.js in your hooks/after_prepare folder with the following code:
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const _ = require('lodash');
const xml2js = require('xml2js');
// here add/remove permissions you need for Android app
let permissions = [
'android.permission.INTERNET',
'android.permission.ACCESS_NETWORK_STATE',
'android.permission.ACCESS_WIFI_STATE'
];
module.exports = function (context) {
const parseString = xml2js.parseString;
const builder = new xml2js.Builder();
const manifestPath = context.opts.projectRoot + '/platforms/android/AndroidManifest.xml';
const androidManifest = fs.readFileSync(manifestPath).toString();
let manifestRoot,
missedPermissions;
if (androidManifest && permissions.length > 0) {
parseString(androidManifest, (err, manifest) => {
if (err) return console.error(err);
manifestRoot = manifest['manifest'];
if (!manifestRoot['uses-permission']) {
manifestRoot['uses-permission'] = [];
}
missedPermissions = _.difference(permissions, _.map(manifestRoot['uses-permission'], `$['android:name']`));
if (missedPermissions.length > 0) {
missedPermissions.forEach(perm => manifestRoot['uses-permission'].push({'$': {'android:name': perm}}));
fs.writeFileSync(manifestPath, builder.buildObject(manifest));
console.log(`Added ${missedPermissions.length} permissions:`);
missedPermissions.forEach(perm => console.log(` - ${perm}`));
}
});
}
};
// after that adjust yous config.xml to look like this:
<widget ...>
...
<platform name="android">
...
<hook type="after_prepare" src="hooks/after_prepare/020_add_android_permissions.js"/>
</platform>
...
</widget>
// run `ionc build android`
// Enjoy!
@niczak
Copy link

niczak commented Jul 7, 2017

This works PERFECTLY, thank you so much for sharing!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment