2016-07-25 19 views
3

Ich habe es jetzt tagelang probiert, ohne Erfolg zu laufen.Xamarin IntentService gestartet von HardwareButton

Ich versuche auf eine Hardware-Taste von meinem Handheld über die Funktionen ihrer spezifischen SDK zu reagieren (es ist ein Panasonic Toughpad). Ich erzeuge diesen Code in Xamarin und ich habe ein Beispiel des SDK in Java.

Hier ist mein Code:

Zunächst wird der Dienst selbst. 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 
      { 

      } 
     } 

Hier ist der Code des AndroidManifest snipped. 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> 

Ich bin in dieser API neue Dinge zu verbinden. In meinen Gedanken sollte der Intent jetzt über den Filter HandheldButtons hören. Wenn ich also auf die AppButton meines Handhelds klicke, sollte es die IntentServices Funktionen starten?!? Oder liege ich falsch? In meiner Meinung machen sie dasselbe in ihrem Java-Beispiel.

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> 

---- UPDATE 04.08 ----

Nur zur Information . Ich habe auch versucht, die Veranstaltung von der APPBUTTON mit einer BroadcastReceiver zu bekommen und lassen Sie die IntentService ohne Erfolg starten. Hier sind die hinzugefügte Code 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 AndroidManifest:

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

Ein paar Dinge zu überprüfen, da ich es nicht in Ihrem Code sehen: 1) Sind die richtigen Berechtigungen in Ihrer Xamarin-Anwendung im Vergleich zu der Beispiel-App gegeben? (Können Sie auch eine Verbindung zur Beispielanwendung herstellen?) 2) Stellen Sie sicher, dass diese benutzerdefinierte Absicht gesendet und ordnungsgemäß empfangen werden kann. Verwenden Sie 'SendBroadcast (Intent)', um dies lokal in Ihrer Aktivität zu testen. –

Antwort

0

Ich habe jetzt eine Lösung für dieses Problem.

Sie müssen überprüfen, ob Sie die Kontrolle über die Gerätetasten haben. Wenn nicht, müssen Sie die IntentService für die Schaltflächen über ein Menü auswählen. Nach der Auswahl Ihrer Anwendung wird der Service funktionieren. Diese einfache Check wird die Probleme mit den IntentService Griff:

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); 
       } 

Sie haben nicht den Broadcast-Dienst mit dieser Lösung benötigen. Der IntentService selbst ist ausreichend.