【问题标题】:AccessibilityService stops working after a whileAccessibilityService 一段时间后停止工作
【发布时间】:2022-07-15 21:33:07
【问题描述】:

我有一个通话记录应用程序。

如您所知,对于 Android 10 及更高版本,我必须使用 AccessibilityService。

从一开始一切都运行良好,但一段时间后 onServiceConnected 不再运行,即使无障碍服务已开启。

我不知道为什么或如何找到这个问题的原因。

比如我重启手机,onServiceConnected不再运行等情况。

MainActivity 代码:

@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" />

在搭载 android 10 的华为 y9 手机上测试。

【问题讨论】:

  • @blackapps 请回答我的问题。
  • @naXa 请回答我的问题。
  • @ChrisCM 请回答我的问题。

标签: android accessibility accessibilityservice call-recording onserviceconnected


【解决方案1】:

根据 Google 的新政策,您不能再使用无障碍服务进行通话录音article from the Vergearticle from digital news today 并在其2022 Policy update 中宣布。

“只有旨在帮助残障人士使用他们的设备或以其他方式克服因残障而产生的挑战的服务才有资格声明它们是无障碍工具。”

我不确定这是否是您面临所面临问题的原因,但对于将来查看此问题的任何人来说,这将是相关信息。

【讨论】:

    【解决方案2】:

    @ShahinSadeghi Accessibility Service onServiceConnected 函数仅在用户打开您的无障碍服务时调用,之后不会调用。所以在你的 MainActivity 中你应该实现一个按钮,当按下它时应该调用你在 onServiceConnected 中定义的函数。

    您也可以根据某些条件在 onAccessibilityEvent 函数中执行此操作,而不是 onServiceConnected。

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多