【问题标题】:Android Accessibility Service not receiving Notification in oreoAndroid Accessibility Service 未在 oreo 中收到通知
【发布时间】:2018-09-21 21:13:59
【问题描述】:

我已在我的应用程序中添加了 android 可访问性,它在 pre oreo 设备上运行良好,但在 oreo 中我无法接收应用程序的第二次通知。

我只能接收应用程序的第一个通知,无法接收该应用程序的第二个通知。如果我将清除通知托盘中的通知,那么我将能够收到第一个通知,而第二个则没有收到。

例如

  1. 从whatsapp收到通知1,服务可以读取它
  2. 从whatsapp收到通知2,服务无法读取它
  3. 收到来自 Gmail 的通知 3,服务可以读取它
  4. 收到来自 Gmail 的通知 4,服务无法读取它
  5. 从whatsapp收到通知5,服务无法读取它

简而言之,从应用程序的 oreo 中忽略第二次以后的通知可访问性。

我的辅助功能代码,

    public class NotificationService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent evt) {
     Toast.makeText(this, "Got event from " + evt.getPackageName(), 
    Toast.LENGTH_SHORT)
            .show();
      }

      @Override
  public void onInterrupt() { }
}

我的清单文件:

<application>
    <activity
        android:name=".MyActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name=".NotificationService" android:enabled="true" 
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    </service>
</application>

【问题讨论】:

  • 你能详细说明问题吗?
  • 我正在更新相关示例。
  • 请检查我的答案。

标签: android accessibility accessibilityservice


【解决方案1】:

辅助功能服务可能会在不通知用户的情况下停止,这是一个已知问题。请参考以下代码以检查服务是否仍在运行。

  // To check if service is enabled
        public boolean isAccessibilitySettingsOn(Context mContext) {
            int accessibilityEnabled = 0;
            final String service = getPackageName() + "/" + CustomAccessiblityService.class.getCanonicalName();
            try {
                accessibilityEnabled = Settings.Secure.getInt(
                        mContext.getApplicationContext().getContentResolver(),
                        android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
                Log.v(getString(R.string.app_name), "accessibilityEnabled = " + accessibilityEnabled);

                //accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);

            } catch (Settings.SettingNotFoundException e) {
                Log.e(getString(R.string.app_name), "Error finding setting, default accessibility to not found: "
                        + e.getMessage());
            }
            TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

            if (accessibilityEnabled == 1) {
                Log.v(getString(R.string.app_name), "***ACCESSIBILITY IS ENABLED*** -----------------");
                String settingValue = Settings.Secure.getString(
                        mContext.getApplicationContext().getContentResolver(),
                        Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
                if (settingValue != null) {
                    mStringColonSplitter.setString(settingValue);
                    while (mStringColonSplitter.hasNext()) {
                        String accessibilityService = mStringColonSplitter.next();

                        Log.v(getString(R.string.app_name), "-------------- > accessibilityService :: " + accessibilityService + " " + service);
                        if (accessibilityService.equalsIgnoreCase(service)) {
                            Log.v(getString(R.string.app_name), "We've found the correct setting - accessibility is switched on!");
                            return true;
                        }
                        else{
                            startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0);
                        }
                    }
                }
            } else {
                Log.v(getString(R.string.app_name), "***ACCESSIBILITY IS DISABLED***");
                startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0);
            }

            return false;
        }

尝试在您的服务中使用此方法,这样您就不会一次又一次地错过通知。希望它会有所帮助。如果有帮助,请接受答案。 谢谢。

【讨论】:

  • 辅助功能运行正常。奥利奥的其他东西有问题。因为如果要清除消息,那么我将收到来自应用程序的第一个通知,第二个则不会收到。现在,如果我再次清除通知,那么我可以收到这样的第一个通知
  • 你是在检查 Event 的类型还是仅仅依赖 onAccessibilityEvent() 方法? @NiravKhunt
  • 我只依赖 onAccessibilityEvent() 因为在 xml 中我提供了事件类型 'typeNotificationStateChanged' 所以我会收到通知更改的通知。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多