AccessibilityService перестает работать через некоторое время

У меня есть приложение для записи звонков.

Как вы знаете, для Android 10 и выше я должен использовать AccessibilityService.

С самого начала все работает нормально, но через некоторое время onServiceConnected больше не работает, хотя служба специальных возможностей включена.

Я понятия не имею, почему и как найти причину этой проблемы.

Например, когда я перезагружаю телефон, onServiceConnected больше не запускается и другие случаи.

Код основной активности:

      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       
        if (Build.VERSION.SDK_INT >= 29) {
            if (!isAccessibilityServiceEnabled()) {
                startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
            }
        }

    }
    private boolean isAccessibilityServiceEnabled() {
        int accessibilityEnabled = 0;
        final String service = getPackageName() + "/" + RecordingAccessibilityService.class.getCanonicalName();

        try {
            accessibilityEnabled = Settings.Secure.getInt(getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
        } catch (Settings.SettingNotFoundException e) {

        }
        TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

        if (accessibilityEnabled == 1) {
            String settingValue = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);

            if (settingValue != null) {
                mStringColonSplitter.setString(settingValue);
                while (mStringColonSplitter.hasNext()) {
                    String accessibilityService = mStringColonSplitter.next();

                    if (accessibilityService.equalsIgnoreCase(service)) {
                        return true;
                    }
                }
            }
        }

        return false;

    }

Код службы доступности:

      public class RecordingAccessibilityService extends AccessibilityService {


    @Override
    protected void onServiceConnected() {
        instance = this;
        super.onServiceConnected();

      TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        PhoneStateListener phoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {

                if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    Toast.makeText(getApplicationContext(), "onServiceConnected", Toast.LENGTH_SHORT).show();
                    updateNotification();
                    startRecord();
                }

                if (state == TelephonyManager.CALL_STATE_IDLE) {
                    stopRecord();
                }
                super.onCallStateChanged(state, incomingNumber);
            }
        };

        if (mgr != null) {
            mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    }
}

Код манифеста:

       <service
            android:name=".RecordingAccessibilityService"
            android:exported="false"
            android:label="@string/accessibility_description"
            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/accessibility_service_config" />
        </service>

код конфигурации службы специальных возможностей:

      <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowContentChanged|typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_description"
    android:label="@string/app_name"
    android:notificationTimeout="100" />

Протестировано на телефоне Huawei y9 с Android 10.

2 ответа

Служба доступности @ShahinSadeghionServiceConnectedфункция вызывается только тогда, когда пользователь включает вашу службу специальных возможностей, а не после этого. Итак, в вашей MainActivity вы должны реализовать кнопку, которая при нажатии должна вызывать функцию, которую вы определили в onServiceConnected.

Вы также можете сделать это в функции onAccessibilityEvent на основе некоторых критериев, а не onServiceConnected.

В соответствии с новыми политиками Google вы больше не можете использовать службы специальных возможностей для записи звонков из статьи Verge, статьи из цифровых новостей сегодня и объявленного в их обновлении политики 2022 года .

«Только сервисы, предназначенные для того, чтобы помочь людям с ограниченными возможностями получить доступ к своему устройству или иным образом преодолеть проблемы, связанные с их инвалидностью, имеют право заявлять, что они являются инструментами доступности».

Я не уверен, является ли это причиной того, что вы столкнулись с проблемой, с которой столкнулись, но это будет актуальная информация для всех, кто будет рассматривать этот вопрос в будущем.

Другие вопросы по тегам