知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
android Service中可以使用onkeydown偵測音量鍵嗎?
1樓
版上的同學 大家好!

目前我正在寫一各android的功能叫onKeyDown
我想要在長按音量鈕(>3秒)後能夠啟動一各class(在下面的程式碼中我先以toast代替這各class)
由於要能夠長駐背景
所以我把偵測長按音量鈕的程式碼放在service裡面
不過程式執行到onKeyDown()這一段沒有反應,
我還在onkeydown()後面放了一各ff()測試,這ff()是會被run然後跳出"測試ff是否被執行",
這代表在我的程式碼中,onKeyDown()無法執行
可以請教這是什麼原因嗎?
謝謝

===========================================
package com.myvoulume;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.view.KeyEvent;
import android.widget.Toast;

public class MyVolumeBackground extends Service {

@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onCreate(){
super.onCreate();
Toast.makeText(this, "On Create...", Toast.LENGTH_SHORT).show();
}
public void onStart(Intent intent, int startID){
super.onStart(intent, startID);
Toast.makeText(this, "On Start...", Toast.LENGTH_SHORT).show();
     onKeyDown(startID, null);
     ff();
}
public void ff(){
Toast.makeText(this, "測試ff是否被執行", Toast.LENGTH_SHORT).show();
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
         if(keyCode==KeyEvent.KEYCODE_VOLUME_UP){
                 Toast.makeText(this, "按下了上音量鍵", Toast.LENGTH_SHORT).show();
                 return true;
         }else if(keyCode==KeyEvent.KEYCODE_VOLUME_DOWN){
                 Toast.makeText(this, "按下了下音量鍵", Toast.LENGTH_SHORT).show();
             //  return true;
         }
         return true;
     }
 
public void onDestroy(){
super.onDestroy();
}
}
===========================================
2樓
Hi Jimmy:

在Android中Services是在後台運行的服務,並沒有直接與前台用戶互動的介面,因此

Services是無法單獨取得到Key Event. 你在Services中 的onKeyDown(int keyCode, KeyEvent event) 

函式,將會被當成一般的函式,而不是overriding method.

如果你需要抓KeyEvent至Services互動使用.那麼你必須要先有一個Activity在前台抓取Key Event後在

傳遞給後台Services使用.


目前也只有自行建立的InputMethod,才有能力在後台也可以抓取到Hard Key Event.但這也是要在用戶切

換去使用你的InputMethod的情況下才會抓的到Key.


之所以會有如此的限制也是基於安全性的考量,試想: 如果在背景的Services也可以隨時抓取到用戶的KeyEvent

那麼就會有很多類似建盤側錄的惡軟體,當你在前面要登入網路銀行輸入帳號密碼時,你應該不會想要讓後台的Services

也可以讀取到你輸入的帳號和密碼才是. 



BR.
Kyle.
3樓
補充一下,如果要在背景偵測一些Hard key Event,大概只靠系統發出的BroadCastReciever
你可以參考SDK的檔案中的broadcast_action.txt,裡面有所有Android系統發出的broadcast事件
platforms\android-10\data\broadcast_actions.txt

但目前我看到的關於Audio的大概只有針對藍芽的audio state changed.可能沒有你需要的音量鍵大小聲的broadcast
android.media.SCO_AUDIO_STATE_CHANGED
4樓
謝謝你阿
因為我對java不熟,
這樣子我知道拉
我在想想
用action.SCREEN_ON的方式
改用偵測電源鍵長按的方式看看
試成功在PO上來