2016-07-25 1 views
3

J'ai essayé pendant des jours pour que cela fonctionne, sans aucun succès. J'essaie de réagir sur un bouton matériel de mon ordinateur de poche via les fonctions de leur SDK spécifique (c'est un Panasonic Toughpad). Je génère ce code dans Xamarin et j'ai un échantillon du SDK en Java.Xamarin IntentService démarré par HardwareButton

Voici mon code:

tout d'abord le service lui-même. serviceClass:

[Service] 
    [IntentFilter(new[] { "com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON" })] 
    class ButtonIntentService : IntentService 
    { 
     public ButtonIntentService() :base("ButtonIntentHandlerThread"){ } 

     protected override void OnHandleIntent(Intent intent) 
     { 
      if (!intent.Action.Equals(AppButtonManager.ActionAppbutton)) 
      { 
       return; 
      } 

      if (ButtonTestFragment.getInstance() !=null) 
      { 
       ButtonTestFragment.getInstance().updateButtonState(intent); 
      } 
      else 
      { 

      } 
     } 

Voici le code snipped du AndroidManifest. AndroidManifest:

<service 
     android:enabled="true" 
     android:name="com.SoftwareTestXamarin.Droid.ButtonIntentService" 
     android:label="button api Sample" 
     android:exported="true"> 
    <intent-filter> 
    <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/> 
    </intent-filter> 
</service> 

Je suis nouveau dans cette API choses connexion. Dans mes pensées, l'intention devrait maintenant entendre sur le HandheldButtons via le filtre. Donc, lorsque je clique sur le AppButton de mon ordinateur de poche, les fonctions IntentServices doivent démarrer?!? Ou ai-je tort? Dans mon avis, ils font la même chose dans leur échantillon Java.

code:

serviceClass:

public class ButtonIntentService extends IntentService { 

    public ButtonIntentService() { 
     super("Button Intent Handler Thread"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (!intent.getAction().equals(AppButtonManager.ACTION_APPBUTTON)) { 
      // Ignore.. 
      return; 
     } 

     if (ButtonTestFragment.getInstance() != null) { 
      ButtonTestFragment.getInstance().updateButtonState(intent); 
     } 

    } 

AndroidManifest:

<service 
      android:name="com.panasonic.toughpad.android.sample.buttons.ButtonIntentService" 
      android:label="@string/lbl_button_service" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/> 
      </intent-filter> 
     </service> 

---- ---- ACTUALISATION 04,08

Juste pour votre information . J'ai également essayé d'obtenir l'événement du APPBUTTON avec un BroadcastReceiver et le laisser commencer le IntentService sans aucun succès. Voici le code ajouté Snippets:

[BroadcastReceiver] 
    [IntentFilter(new[] { "com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON" }, Priority = (int)IntentFilterPriority.HighPriority)] 
    class ButtonReceiver : BroadcastReceiver 
    { 
     public override void OnReceive(Context context, Intent intent) 
     { 
      var serviceIntent = new Intent(context, typeof(ButtonIntentService)); 
      serviceIntent.PutExtras(intent); 
      context.StartService(serviceIntent); 
     } 
    } 

Snippet de AndroidManifest:

<receiver android:name="ButtonReceiver"> 
     <intent-filter> 
      <action android:name="com.panasonic.toughpad.android.api.appbutton.intent.APPBUTTON"/> 
     </intent-filter> 
    </receiver> 
+1

Quelques choses à vérifier car je ne le vois pas dans votre code: 1) Les autorisations appropriées sont-elles données dans votre application Xamarin par rapport à l'application exemple? (Pouvez-vous également créer un lien vers l'exemple d'application?) 2) Assurez-vous que cette intention personnalisée peut être diffusée puis reçue correctement. Utilisez 'SendBroadcast (Intent)' pour le tester localement dans votre activité. –

Répondre

0

Je suis maintenant une solution à ce problème.

Vous devez vérifier si vous avez le contrôle des boutons de l'appareil. Sinon, vous devez choisir le IntentService pour les boutons via un menu. Après avoir sélectionné votre application, le service fonctionnera. Cette simple vérification traitera les problèmes avec le IntentService:

if (!AppButtonManager.HasButtonControl) 
       { 
        Intent reconfigureApp = new Intent(Intent.ActionMain); 
        reconfigureApp.AddCategory(Intent.CategoryLauncher); 
        reconfigureApp.SetFlags(ActivityFlags.NewTask); 
        reconfigureApp.SetComponent(new ComponentName("com.panasonic.toughpad.android.service", 
                   "com.panasonic.toughpad.android.appbuttondelegator.ConfigActivity")); 
        activity.StartActivity(reconfigureApp); 
       } 

Vous n'avez pas besoin de la diffusion-service avec cette solution. L'IntentService lui-même est suffisant.