我正在尝试扩展 AccessibiltyService 以拦截通知事件。我的问题是我的类是由它创建的,它从不连接到服务。
这就是我的应用程序的工作方式:
- 有一个服务 (StatisticsService) 管理多个统计信息的收集,并且还需要监视通知事件。
- 为此,它为每个感兴趣的统计数据创建一个 StatCollector(一个 java 对象)。
- 所有 StatCollector 都实现相同的接口,并且一旦创建它们就会存储 StatisticService 上下文。
- 这个 StatCollector 之一启动了我的 NotificationService,它扩展了 AccessibilityService。
以下是相关的类:
统计收集器:
public class NotificationCollector implements
StatCollectorInterface {
private Context context = null;
private Intent notificationServiceIntent = null;
private boolean collectorStarted = false;
/**Constructor**/
public NotificationCollector(Context context) {
this.context = context;
collectorStarted = false;
}
@Override
public void startCollector() {
if (collectorStarted == true)
{
return;
}
collectorStarted = true;
notificationServiceIntent = new Intent(context,NotificationService.class);
context.startService(notificationServiceIntent);
}
@Override
public void stopCollector() {
if (collectorStarted == false)
{
return;
}
collectorStarted = false;
context.stopService(notificationServiceIntent);
}
通知服务:
public class NotificationService extends AccessibilityService {
private static final Logger logger = LoggerFactory.getLogger ("Notification");
@Override
public void onCreate()
{
logger.trace("onCreate");
super.onCreate();
}
@Override
public void onDestroy()
{
logger.trace("onDestroy");
super.onDestroy();
}
/**Methods from Accessibility Service**/
@Override
protected void onServiceConnected() {
logger.trace("onServiceConnected");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
info.notificationTimeout = 100;
setServiceInfo(info);
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
logger.trace("onAccessibilityEvent");
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
logger.trace("notification: " + event.getText());
}
}
}
Manifest.xml:(相关组件)
<service android:name=".StatisticsService"/>
<service android:name=".service.NotificationService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice" />
</service>
...
<uses-permission android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
请注意,如果我将 android.permission.BIND_ACCESSIBILITY_SERVICE 添加到 NotificationService 应用程序崩溃并出现以下错误
java.lang.RuntimeException: Unable to start service my.app.StatisticsService@406657d0
with Intent { cmp=my.app/.StatisticsService (has extras) }: java.lang.SecurityException:
Not allowed to start service Intent { cmp=my.app/.NotificationService } without permission android.permission.BIND_ACCESSIBILITY_SERVICE
我认为问题在于系统忽略了我的 NotificationService 类,因为它没有明确提到它具有 BIND_ACCESSIBILITY_SERVICE 权限。但是如果我将它添加到清单文件中的服务中,应用程序就会崩溃。
我错过了什么/做错了什么?
谢谢
更新
感谢Cyanide博士的评论,我发现用户应该在设置下的辅助功能菜单中为某个应用程序启用辅助功能。
此外,标签
<uses-permission android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
对于前果冻豆版本来说不是必需的,所以我已经删除了它,因为我使用的是 ICS。
现在该应用程序完全按预期工作