2012-06-18 3 views
11

Я хочу регистрировать все события тостов в android ics (4.0.3), но мне не удалось зарегистрировать системное событие. Служба просто не запускается!служба доступности не запущена

В соответствии с этим вопрос: onAccessibilityEvent(AccessibilityEvent event) not intercepting notification

MyAccessibilityService.java

package com.test.toasts2; 

import android.accessibilityservice.AccessibilityService; 
import android.accessibilityservice.AccessibilityServiceInfo; 
import android.app.Notification; 
import android.os.Parcelable; 
import android.util.Log; 
import android.view.accessibility.AccessibilityEvent; 
import android.widget.Toast; 

public class MyAccessibilityService extends AccessibilityService { 


    public static final String TAG = "volumeMaster"; 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) 
    { 
     Log.v(TAG, "***** onAccessibilityEvent"); 
     Toast.makeText(getApplicationContext(), "Got event from: " + event.getPackageName(), Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onInterrupt() 
    { 
     Log.v(TAG, "***** onInterrupt"); 
    } 

    @Override 
    public void onServiceConnected() 
    { 
     Log.v(TAG, "***** onServiceConnected");  


     AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
     info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; 
     info.notificationTimeout = 100; 
     info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK; 
     setServiceInfo(info); 

    } 
} 

Toast2Activity.java

package com.test.toasts2; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Toast; 

public class Toast2Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Intent i = new Intent(this, MyAccessibilityService.class); 
     startService(i); 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.test.toasts2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
<service android:name=".MyAccessibilityService" android:label="@string/app_name" android:enabled="true" android:exported="false"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
     </intent-filter> 

</service> 

     <activity 
      android:name=".Toast2Activity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

Я включил тег активности в манифесте (для запуска службы при запуске приложения), а также попытался удалить. Ничего не изменилось. Служба просто не запускается. Я не получаю уведомления в log cat (Log.v в onServiceConected).

Я компилирую это как обычное приложение (не системное приложение), android 4.0.3. Я делаю что-то неправильно?

Прикрепленный проект (может быть ошибка где-то еще, или может быть, я компиляции неправильно): https://dl.dropbox.com/u/1928109/toast2.zip

ответ

32

Вам необходимо включить службу доступности в меню настроек системы:

  • Установить ваше приложение на тестовом устройстве.

  • С приложением, установленным на устройстве, измените следующие настройки на устройстве:

    Home Screen> Системные настройки> Accessibility> Доступность услуги> Toast2> Изменить Выкл значение Вкл,

    где Toast2 - ваше имя приложения.

  • Затем запустите приложение.

AFAIK нет способа установить доступность программно в режим On из вашего приложения. В качестве временного решения можно предложить пользователю, чтобы изменить настройку, и если они согласны, нажав на кнопку, запустить системные настройки доступности, как так:

Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); 
startActivityForResult(intent, 0); 
+6

Я не могу найти службы доступности в Android 4.2.1 – Klaasvaak

+0

Ваш код действительно полезен. Спасибо за это. Есть ли способ включить службу доступности через код? – Kameswari

+0

@ Kameswari Никакой способ сделать это, насколько я знаю. –

9

В качестве дополнительного ответа на замечания, еще одна вещь, которую стоит отметить что вы должны объявить разрешение - android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" в вашей службе, иначе не будет переключателя в настройке -> доступности.