【问题标题】:how to detect long press of volume button in android如何在android中检测长按音量按钮
【发布时间】:2013-11-08 10:27:24
【问题描述】:

我正在开发应用程序,无论我的应用程序是后台还是前台,我都希望在您长按音量增大或减小按钮时为用户提供执行特定操作的功能。

我也想在手机屏幕关闭时实现此功能,但在堆栈溢出帖子中说你不能这样做。

我已经使用android.media.VOLUME_CHANGED_ACTION 广播监听器进行音量按钮按下检测,无论你的应用是后台的,它都能正常工作,但问题是我想检测这些按钮的长按。

如何将此代码包含到我的广播中,以便我可以长时间检测向上或向下按钮。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
        // Do something here...
       // Needed to track long presses
        Log.e("Main activity", "KEYCODE_VOLUME_UP");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

这是我的广播接收器

 intentfliter  = new IntentFilter("android.media.VOLUME_CHANGED_ACTION");
       mReceiver  = new BroadcastReceiver()
                {   
                @Override
                public void onReceive(Context context, Intent intent) {
                    // TODO Auto-generated method stub
                         Log.e("Main activity", "Volume button press");     
                }
                };
                getApplicationContext().registerReceiver(mReceiver, intentfliter); 
                 manager.registerMediaButtonEventReceiver(getCallingActivity());


     }

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:
    package com.example.androidsample;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.logging.Logger;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    
    
    
    public class VolumeButtonPressedBroadcast extends BroadcastReceiver{
    
        public static boolean sIsReceived; // this is made true and false after each timer clock
        public static Timer sTimer=null;
        public static int i;
        final int MAX_ITERATION=15;
        public static boolean sIsAppWorkFinished=true;
        @Override
        public void onReceive(final Context context, Intent intent) 
        {
    
    
            sIsReceived=true; // Make this true whenever isReceived called
            if(sTimer==null && sIsAppWorkFinished){
                sTimer=new Timer();
                sTimer.schedule(new TimerTask() {
    
                    @Override
                    public void run() {
                        if(sIsReceived){  // if its true it means user is still pressing the button
                            i++;
                        }else{ //in this case user must has released the button so we have to reset the timer
                            cancel(); 
                            sTimer.cancel();
                            sTimer.purge();
                            sTimer=null;
                            i=0;
                        }
                        if(i>=MAX_ITERATION){ // In this case we had successfully detected the long press event
                            cancel();
                            sTimer.cancel();
                            sTimer.purge();
                            sTimer=null;
                            i=0;
                            //it is called after 3 seconds
                        }
    
                        sIsReceived=false; //Make this false every time a timer iterates
                    }
                }, 0, 200);
            }
    
        }
    
    }
    

    【讨论】:

    • @Swap-IOS-Android 我已经编辑了我的代码并使其更简单。我只是使用了简单的逻辑 - 一旦在 OnReceive 中收到调用,我就会启动一个计时器,它在迭代时间检查(根据你的愿望)。每次调用计时器时,我都使用一个标志来跟踪按下状态。如果用户没有按下按钮,我只是释放了计时器。但是当你成功检测到事件时必须小心,你可以使用它的首选项,因为用户可能仍然按下按钮并且在这种情况下计时器将再次启动。
    • @Swap-IOS-Android 对你有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多