addPermissionInManifest function

Future<void> addPermissionInManifest({
  1. required String permissionName,
})

Implementation

Future<void> addPermissionInManifest({required String permissionName}) async {
  if (permissionName.isEmpty) return;

  final file = File('android/app/src/main/AndroidManifest.xml');

  final document = XmlDocument.parse(await file.readAsString());

  final manifest = document.getElement('manifest');
  final permissions = document.findAllElements('uses-permission');

  bool exists = permissions.any((node) => node.getAttribute('android:name') == permissionName);

  if (!exists) {
    final builder = XmlBuilder();
    builder.element('uses-permission', nest: () {
      builder.attribute('android:name', permissionName);
    });

    final newPermission = builder.buildFragment().children.first.copy();

    final applicationNode = manifest?.getElement('application');

    if (applicationNode != null) {
      final index = manifest!.children.indexOf(applicationNode);
      manifest.children.insert(index, newPermission);
    } else {
      manifest?.children.add(newPermission);
    }

    await file.writeAsString(document.toXmlString(pretty: true));
  }
}