NathanaelA / nativescript-permissions

Wraps up the entire Android 6 permissions system in a easy to use plugin.
MIT License
46 stars 22 forks source link

requestPermission fails for android.permission.BIND_ACCESSIBILITY_SERVICE #21

Closed codef0rmer closed 6 years ago

codef0rmer commented 7 years ago

I'm trying to get a permission for android.permission.BIND_ACCESSIBILITY_SERVICE but it always returns {"android.permission.BIND_ACCESSIBILITY_SERVICE":false}.

var permissions = require('nativescript-permissions');
readAccessibility()
.catch(function(error) {
   console.log(JSON.stringify(error)); // {"android.permission.BIND_ACCESSIBILITY_SERVICE":false}
});
function readAccessibility() {
    permissions.requestPermission(
        android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE,
        'Need permission to read USSD'
    );
}

Additionally, I've <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> under AndroidManifest.xml

Any idea why it does not work?

haiderghaleb commented 7 years ago

did you manage to make it work?

codef0rmer commented 7 years ago

@haiderghaleb Nope, not sure why though. However, I managed to do it differently,

  1. Added following service block and permissions in AndroidManifest.xml.
<uses-permission android:name="android.permission.RETRIEVE_WINDOW_CONTENT" />
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<service android:name="com.tns.notifications.USSDService" android:enabled="true" android:exported="false" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:canRetrieveWindowContent="true" android:accessibilityFlags="flagRetrieveInteractiveWindows">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
</service>
  1. Create app/notifications/USSDService.js.
android.accessibilityservice.AccessibilityService.extend("com.tns.notifications.USSDService", {
  onAccessibilityEvent: function(event) {
    var dialogText = event.getText().toString();
  },

  onServiceConnected: function() {
    console.log('USSD connected');
    this.super.onServiceConnected();
    // This code allows me to read content out of USSD dialog
    var AccessibilityServiceInfo = android.accessibilityservice.AccessibilityServiceInfo;
    var info = new AccessibilityServiceInfo();
    info.packageNames = ["org.nativescript.MyApp"];
    info.flags = AccessibilityServiceInfo.DEFAULT;
    info.eventTypes = android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
    this.setServiceInfo(info);
  }
});
  1. When you turn on the accessibility settings for the app, you must see USSD connected in the log (terminal).