2016-09-15 11 views
0

ServiceConnectionクラスでOnServiceConnectedイベントを試してみました。 「VAR myObjectという= IBinderObject myBinderClassとして、」私はそのようにしてくださいしようとした場合でも、(IBinderを継承し、それはバインダーを継承し、)私のクラスにIBinderをキャストすると、nullを返します私は「するvar myObjectという=(myBinderClass)IBinderObject;」として、それを実行しようとした場合、またはエラーをキャスト。 してください、任意の作業例...Mono(Xamarin)でAccessibilityServiceにバインドする方法

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]のイベントをオーバーライドしていない、ので、バインダーはnullですインスタンスを提供していないためです。

あなたのサービスにこれを追加します。

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.App.ServiceではなくAndroid.AccessibilityServices.AccessibilityServiceを継承します。 – 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

関連する問題