Fingerprint gesture availability always false for android 9

Viewed 286

I'm trying to use fingerprint gestures in an accessibility service. It is working fine in android 8.1 devices (Nexus 5x emulator, Moto G5s Plus) but not working in android 9 devices (Nexus 5x emulator, Samsung M30s). I've added all the required lines mentioned in this question:

Android O - fingerprint gesture callback not working

Do I have to add something extra for android 9? Can someone please help me?

activity_service.xml:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFeedbackType="feedbackGeneric"
android:canRequestFingerprintGestures="true"
android:accessibilityFlags="flagDefault|flagRequestFingerprintGestures"
android:canPerformGestures="true"/>

MyAccessibilityService.java:

public class MyAccessibilityService extends AccessibilityService {

private static final String TAG = MyAccessibilityService.class.getSimpleName();

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    Log.d(TAG, "onAccessibilityEvent");
}

@Override
public void onInterrupt() {
    Log.d(TAG, "onInterrupt");
}

@Override
protected boolean onGesture(int gestureId) {
    Log.d(TAG, "onGesture " + gestureId);
    return super.onGesture(gestureId);
}

@Override
protected boolean onKeyEvent(KeyEvent event) {
    Log.d(TAG, "onKeyEvent " + event.getKeyCode());
    return super.onKeyEvent(event);
}

@Override
public void onDestroy() {
    Toast.makeText(getApplicationContext(), "onDestroy" , Toast.LENGTH_SHORT).show();
    super.onDestroy();
}



@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    Log.d(TAG, "onServiceConnected");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        FingerprintGestureController gestureController = getFingerprintGestureController();

        Toast.makeText(getApplicationContext(), "Is available: " + gestureController.isGestureDetectionAvailable(), Toast.LENGTH_LONG).show();
        Log.e(TAG, "Is available: " + gestureController.isGestureDetectionAvailable() );

        FingerprintGestureController.FingerprintGestureCallback callback = new
                FingerprintGestureController.FingerprintGestureCallback() {
                    @Override
                    public void onGestureDetectionAvailabilityChanged(boolean available) {
                        super.onGestureDetectionAvailabilityChanged(available);
                        Toast.makeText(getApplicationContext(), "Gesture available change to: " + available, Toast.LENGTH_SHORT).show();
                        Log.d(TAG, "onGestureDetectionAvailabilityChanged " + available);
                    }

                    @Override
                    public void onGestureDetected(int gesture) {

                        super.onGestureDetected(gesture);
                        switch (gesture){
                            case GESTURE_SWIPE_DOWN:
                                CameraManager mCameraManager;
                                mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
                                String mCameraId = "";
                                try {
                                    mCameraId = mCameraManager.getCameraIdList()[0];
                                    mCameraManager.setTorchMode(mCameraId, true);
                                }
                                catch (Exception e){

                                }
                                break;
                            case GESTURE_SWIPE_UP:
                                mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
                                try {
                                    mCameraId = mCameraManager.getCameraIdList()[0];
                                    mCameraManager.setTorchMode(mCameraId, false);
                                }
                                catch (Exception e){

                                }
                                break;
                                default:
                                    Toast.makeText(getApplicationContext()
                                            , "Gesture: " + gesture, Toast.LENGTH_SHORT).show();





                        }
                        Log.d(TAG, "onGestureDetected " + gesture);
                    }
                };

        gestureController.registerFingerprintGestureCallback(callback, new Handler());
    }
}

@Override
public boolean onUnbind(Intent intent) {
    Log.d(TAG, "onUnbind " );
    return super.onUnbind(intent);
}}

AndroidManifest.xml:

     <?xml version="1.0" encoding="utf-8"?>
   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.bignerdranch.com.myapplication">
    <uses-feature android:name="android.hardware.fingerprint"/>
    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
    <uses-permission android:name="android.permission." />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <permission android:name="android.permission.FLASHLIGHT"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="normal" />

    <application>
        <service
            android:name=".MyAccessibilityService"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/activity_service" />
        </service>
    </application>

</manifest>
1 Answers
Related