7

Testuję na urządzeniu Pixel z Gestami odcisków palców ON od dostępności. Próbuję uzyskać wywołania zwrotne gestów za pomocą FingerprintGestureController, ale nigdy nie otrzymam żadnych gestów w zamian, nawet po włączeniu dla tej aplikacji WŁĄCZENIA dla tej aplikacji z menu Ustawienia-> Dostępność. isGestureDetectionAvailable() zawsze zwraca mi wartość false. Czy ktoś może ci pomóc.Android O - oddzwanianie odciskiem palca nie działa

Oto kod:

my_gesture_service.xml

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

AndroidManifest.xml

<uses-feature android:name="android.hardware.fingerprint"/> 
    <uses-permission android:name="android.permission.USE_FINGERPRINT" /> 
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/> 
<service 
      android:name="android.gestures.MyService" 
      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/my_gesture_service" /> 
     </service> 

MyService.java

public class MyService extends AccessibilityService { 

    private static final String TAG = MyService.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); 
          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); 
    } 


} 

Odpowiedz

9

Znaleziono odpowiedź. Potrzebowałem tej flagi także w xml:

android:accessibilityFlags="flagDefault|flagRequestFingerprintGestures"