Я пробовал в течение нескольких дней, чтобы добиться этого, без каких-либо успехов.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) Правильные разрешения, указанные в приложении Xamarin, по сравнению с примером приложения? (Можете ли вы также подключиться к образцу приложения?) 2) Убедитесь, что это настраиваемое намерение можно транслировать, а затем правильно получать. Используйте 'SendBroadcast (Intent)', чтобы проверить это локально в своей деятельности. –