2009-11-19 32 views
2

作爲一個簡單的測試,我試圖讓一個broadcastReceiver通知用戶一個Toast消息,在Android中單擊了一個硬件按鈕。聽Android中的硬件按鈕單擊事件

我在我的名字.TestReceiver偵聽當用戶點擊綠色SEND鍵Action_CALL_BUTTON被告知清單文件中創建一個接收器標籤:

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

    } 

} 

感謝

回答

3

這裏有一些原因的任何BroadcastReceiver可能無法接受:

  1. 在特定情況下,ACTION_CALL_BUTTON不是廣播Intent行動。這是一項活動Intent行動,這將不會被BroadcastReceivers截獲。您可以通過documentation for this particular action中的「活動動作」聲明來說明。
  2. 廣播Intent可能不符合清單註冊接收方的資格。 ACTION_BATTERY_STATUS就是這樣一個動作。這些只能由通過registerReceiver()在Java中註冊的接收方接收。不幸的是,遵循這一規則的只是零星記錄。
  3. 您可能需要特殊許可才能獲得Intent。例如,如果您擁有RECEIVE_BOOT_COMPLETED權限,則ACTION_BOOT_COMPLETED僅適用。這些通常在該操作的文檔中提及。
0

因此我可以使用registerReceiver()註冊到ACTION_CALL_BUTTON? 我沒有看到任何需要的權限。

+0

正如我寫道:「在您的具體情況,ACTION_CALL_BUTTON不廣播意圖行動。這是一項活動意圖行動,不會被BroadcastReceivers攔截。你可以通過文檔中的「活動動作」聲明來告訴這個特定動作。「 – CommonsWare 2009-11-19 02:18:35

+0

那麼你是說這是不可能的嗎?我想寫一個服務來接收這個動作 - 不是活動。 – 2011-05-06 15:30:18

0

嘿,你可以按照這個link。你可以看到定製意向的教程通過點擊按鈕來調用廣播意圖

這是清單

<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

你的答案是不是根據問題,他是在談論硬件按鈕 – 2017-05-11 06:03:12

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