2016-07-25 4 views
3

Я пробовал в течение нескольких дней, чтобы добиться этого, без каких-либо успехов.Xamarin IntentService, созданный HardwareButton

Я пытаюсь отреагировать на аппаратную панель с моего карманного устройства через функции их конкретного SDK (это Toughpad от Panasonic). Я генерирую этот код в Xamarin, и у меня есть один образец SDK на Java.

Вот мой код:

Прежде всего служба сама по себе. 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 
      { 

      } 
     } 

Вот код пропущено из 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> 

Я новичок в этом API соединительных вещей. В моих мыслях Intent должен теперь слышать на HandheldButtons через фильтр. Поэтому, когда я нажимаю на AppButton моего портативного компьютера, он должен запустить функции IntentServices?!? Или я ошибаюсь? В моем мнении они делают то же самое в своем примере Java.

Код:

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> 

---- ОБНОВЛЕНИЕ 04,08 ----

Просто для информации , Я также попытался получить событие от APPBUTTON с BroadcastReceiver и дать ему возможность начать IntentService без каких-либо успехов. Вот добавлены фрагменты кода:

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

сниппетов из AndroidManifest:

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

Пара вещей, которые нужно проверить, так как я не вижу ее в вашем коде: 1) Правильные разрешения, указанные в приложении Xamarin, по сравнению с примером приложения? (Можете ли вы также подключиться к образцу приложения?) 2) Убедитесь, что это настраиваемое намерение можно транслировать, а затем правильно получать. Используйте 'SendBroadcast (Intent)', чтобы проверить это локально в своей деятельности. –

ответ

0

теперь я получил решение этой проблемы.

Вы должны проверить, есть ли у вас контроль над кнопками устройства. Если нет, вам нужно выбрать IntentService для кнопок через меню. После выбора вашего приложения служба будет работать. Эта простая проверка будет обрабатывать проблемы с 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); 
       } 

Вам не нужно широковещательного-Service с этим решением. Сам IntentService достаточно.