3

簡単なテストとして、AndroidでハードウェアボタンがクリックされたことをToastメッセージでユーザーに通知するbroadcastReceiverを作成しようとしています。

マニフェストファイルに.TestReceiverという名前のレシーバータグを作成しました。このタグは、ユーザーが緑色の[送信]ボタンをクリックしたときに通知されるAction_CALL_BUTTONをリッスンします。

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

次に、BroadcastReceiverを拡張してToastを作成するTestReceiverクラスを作成しました。通話ボタンをクリックすると、トーストメッセージは表示されませんが、アクティビティでテストしたところ、表示されます。ここで何が欠けていますか?

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

4 に答える 4

3

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これらは通常、そのアクションのドキュメントに記載されています。
于 2009-11-19T01:44:09.663 に答える
0

だから私はACTION_CALL_BUTTON使用して登録できregisterReceiver()ますか?そのために必要な許可は見当たりませんでした。

于 2009-11-19T01:52:44.187 に答える
-1

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);
}
于 2014-12-08T13:35:30.490 に答える