Слушайте аппаратное нажатие кнопки в Android - PullRequest
3 голосов
/ 19 ноября 2009

В качестве простого теста я пытаюсь использовать широковещательный приемник, который уведомит пользователя с помощью сообщения Toast о том, что в Android была нажата аппаратная кнопка.

Я создал тег получателя в моем файле манифеста с именем .TestReceiver, который прослушивает Action_CALL_BUTTON, чтобы получать информацию, когда пользователь нажимает зеленую кнопку SEND:

<receiver android:name=".TestReceiver" >
    <intent-filter>             
        <action android:name="android.intent.action.ACTION_CALL_BUTTON" />
    </intent-filter>            
</receiver>

Затем я создал класс TestReceiver, который расширяет BroadcastReceiver и создает Toast. Когда я нажимаю на кнопку вызова, я не вижу сообщение Toast, но я проверил его на активности, и оно показывает. Что мне здесь не хватает?

package com.example.helloandroid;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class TestReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        CharSequence text = "Hello toast!";
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

    }

}

Спасибо

Ответы [ 4 ]

3 голосов
/ 19 ноября 2009

Вот несколько причин, по которым любой BroadcastReceiver может не получить:

  1. В вашем конкретном случае ACTION_CALL_BUTTON - это не широковещательное Intent действие. Это действие Intent, которое не будет перехвачено BroadcastReceivers. Вы можете сказать это с помощью оператора «Activity Action» в документации для этого конкретного действия .
  2. Трансляция Intent может не подходить для зарегистрированных манифестов получателей. ACTION_BATTERY_STATUS является одним из таких действий. Они могут быть получены только получателями, зарегистрированными в Java через registerReceiver(). К сожалению, которые следуют этому правилу, документируются лишь время от времени.
  3. Вам может потребоваться специальное разрешение для получения Intent. Например, ACTION_BOOT_COMPLETED работает только при наличии разрешения RECEIVE_BOOT_COMPLETED. Они обычно упоминаются в документации к этому действию.
0 голосов
/ 08 декабря 2014

Вы можете использовать onKeyDown () метод

метод: -

@Override
public boolean onKeyDown(int keycode, KeyEvent e) {
    switch(keycode) {
        case KeyEvent.KEYCODE_MENU:
           // Your Task on hard menu click
            break;
        case KeyEvent.KEYCODE_BACK:
          // Your Task on hard back click
             break;

            return true;
    }

    return super.onKeyDown(keycode, e);
}
0 голосов
/ 19 сентября 2014

эй, вы можете перейти по этой ссылке . Вы можете просмотреть учебник по пользовательскому намерению вызвать намерение вещания, нажав кнопку

Это манифест

<receiver android:name="MyReceiver">
  <intent-filter>
     <action android:name="com.tutorialspoint.CUSTOM_INTENT">
  </action>
  </intent-filter>

это класс приемника вещания

public class MyReceiver extends BroadcastReceiver 
{

   @Override
   public void onReceive(Context context, Intent intent) {
   Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}

Объявить этот метод в основной деятельности

public void broadcastIntent(View view)
{
    Intent intent = new Intent();
    intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
    sendBroadcast(intent);
}
}

и, наконец, Ваша кнопка

 <Button android:id="@+id/btnStartService"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/broadcast_intent"
  android:onClick="broadcastIntent"/>
0 голосов
/ 19 ноября 2009

Так я могу зарегистрироваться на ACTION_CALL_BUTTON, используя registerReceiver()? Я не видел никакого разрешения, необходимого для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...