Наличие жеста отпечатка пальца всегда ложно для Android 9 - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь использовать жесты отпечатка пальца в службе доступности. Он отлично работает на устройствах Android 8.1 (эмулятор Nexus 5x, Moto G5s Plus), но не работает на устройствах Android 9 (эмулятор Nexus 5x, Samsung M30s). Я добавил все необходимые строки, упомянутые в этом вопросе:

Android O - обратный вызов жеста отпечатка пальца не работает

Нужно ли добавлять что-то дополнительное для android 9? Может кто-нибудь помочь мне?

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 Ответ

0 голосов
/ 28 октября 2019

Вам необходимо добавить эту строку в службу жестов xml

android: accessibilityFlags = "flagDefault | flagRequestFingerprintGestures"

Это также может быть связано с устройством. Проверьте следующий ответ для информации. Android M FingerprintManager.isHardwareDetected () возвращает false на Samsung Galaxy S5

Можете ли вы предоставить примеры кода для дальнейшей отладки, если это не работает?

...