2016-09-15 2 views
0

Я пробовал и получил событие OnServiceConnected в классе ServiceConnection. Но приведение IBinder к моему классу (он наследует Binder, который наследует IBinder) возвращает null, если я пытаюсь сделать это как «var myObject = IBinderObject как myBinderClass»; или ошибка заливки, если я попытаюсь сделать это как «var myObject = (myBinderClass) IBinderObject;». Пожалуйста, любой рабочий пример ...Как связать с AccessibilityService в Mono (Xamarin)

MainActivity код:

namespace MyApp.Droid 
{ 
    [Activity(Label = "MyApp", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 
    { 
     AccessibilityServiceBinder binder; 
     AccessibilityServiceConnection accessibilityServiceConnection; 
     bool isBound = false, isBoundAC = false, isConfigurationChange = false; 
     protected Intent ServiceIntent; 
     AccessibilityServiceClass ServiceClass; 

     protected override void OnStart() 
     { 
      base.OnStart(); 
      if (!isBoundAC) 
      { 
       accessibilityServiceConnection = new AccessibilityServiceConnection(this); 
       isBoundAC = BindService(ServiceIntent, accessibilityServiceConnection, Bind.AutoCreate); 
       if (isBoundAC) 
       { 
       Toast.MakeText(this, "AccessibilityService is Bound", ToastLength.Long); 
       } 
      } 
     } 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      ServiceIntent = new Intent(this, typeof(AccessibilityServiceClass)); 
      ServiceIntent.SetPackage("android.accessibilityservice.AccessibilityService"); 
      global::Xamarin.Forms.Forms.Init(this, bundle); 
      LoadApplication(new App()); 
     } 
     public class AccessibilityServiceConnection : Java.Lang.Object, IServiceConnection 
     { 
      MainActivity activity; 
      AccessibilityServiceBinder binder; 
      public AccessibilityServiceBinder Binder 
      { 
       get 
       { 
       return (AccessibilityServiceBinder)binder; 
       } 
      } 
      public AccessibilityServiceConnection(MainActivity activity) 
      { 
       this.activity = activity; 
      } 
      public void OnServiceConnected(ComponentName name, IBinder service) 
      { 
       var accessibilityServiceBinder = service as AccessibilityServiceBinder; 
       //accessibilityServiceBinder is always null here 
       if (accessibilityServiceBinder != null) 
       { 
       activity.binder = accessibilityServiceBinder; 
       activity.isBound = true; 
       this.binder = accessibilityServiceBinder; 
       } 
      } 
      public void OnServiceDisconnected(ComponentName name) 
      { 
       activity.isBound = false; 
      } 
     } 
     public override Java.Lang.Object OnRetainNonConfigurationInstance() 
     { 
      base.OnRetainNonConfigurationInstance(); 
      isConfigurationChange = true; 
      return accessibilityServiceConnection; 
     } 
    } 
} 

Сервис-код:

namespace MyApp.Droid 
{ 
    [Service(Label = "MyApp", Permission = Manifest.Permission.BindAccessibilityService), IntentFilter(new[] { "android.accessibilityservice.AccessibilityService" }), MetaData("android.accessibility-service", Resource = "@xml/accessibilityserviceconfig")] 
    public class AccessibilityServiceClass : Android.AccessibilityServices.AccessibilityService 
    { 
     public override void OnAccessibilityEvent(AccessibilityEvent e) 
     { 
      Toast.MakeText(this, "OnAccessibilityEvent", ToastLength.Short); 
     } 

     public override void OnInterrupt() 
     { 
      Toast.MakeText(this, "OnInterrupt", ToastLength.Short); 
     } 

     protected override void OnServiceConnected() 
     { 
      Toast.MakeText(this, "OnServiceConnected", ToastLength.Short); 
     } 
    } 
    public class AccessibilityServiceBinder : Binder 
    { 
     AccessibilityServiceClass service; 

     public AccessibilityServiceBinder(AccessibilityServiceClass service) 
     { 
      this.service = service; 
     } 

     public AccessibilityServiceClass GetAccessibilityService() 
     { 
      return service; 
     } 
    } 
} 
+0

Добавить код услуги – Gusman

+0

Выполнено ... Спасибо. – Gambolt

ответ

0

Вы не перекрывая OnBind событие вашей службы, таким образом, связующим является нулевым поскольку вы не предоставили экземпляр.

Добавьте это к вашим услугам:

AccessibilityServiceBinder binder; 

public override IBinder OnBind (Intent intent) 
{ 
    if(binder == null) 
     binder = new AccessibilityServiceBinder (this); 

    return binder; 
} 

Для получения более подробной информации читайте документацию Xamarin на связанных услуг, они очень хорошо объяснил: https://developer.xamarin.com/guides/android/application_fundamentals/services/part_2_-_bound_services/

EDIT: Всего неправильный ответ (я буду удалять это через несколько минут). Кажется, что невозможно привязать к службе специальных возможностей. Больше информации здесь: android bind to AccessibilityService

+0

Спасибо, но он сказал, что OnBind запечатан и не может быть переопределен ... – Gambolt

+0

AccessibilityServiceClass наследует Android.AccessibilityServices.AccessibilityService, а не Android.App.Service – Gambolt

+0

Да, моя ошибка, поскольку я вижу, что внутренняя реализация создает IAccessibilityServiceClientWrapper (источник здесь: https://sourcegraph.com/android.googlesource.com/platform/frameworks/base/-/info/JavaArtifact/AndroidSDK/-/android/accessibilityservice/AccessibilityService:type/onBind:android.content.Intent), поэтому Я полагаю, что службы доступности не должны быть привязаны, некоторые другие сообщения говорят об этом (http://stackoverflow.com/questions/9683927/android-bind-to-accessibilityservice) – Gusman

Смежные вопросы