2017-08-02 63 views
-5

我正在开发一个应用程序,其中点击电源按钮上的数字按钮(4次),但现在的问题是当用户按下home按钮4次时,它将触发该呼叫,我只需要侧面电源按钮单击。如何在Android应用程序中获取侧电源按钮点击次数?

+0

分享你的代码......你有什么尝试,直到现在 – Akshay

+0

你试试这个https://stackoverflow.com/questions/37157921/want-to-access-power-button-events-in-android?answertab=票#tab-top? –

+0

[想要访问Android中的电源按钮事件]的可能的副本(https://stackoverflow.com/questions/37157921/want-to-access-power-button-events-in-android) – JRG

回答

0

我在清单

<receiver 
     android:name=".services.SOSBroadcastReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.SCREEN_OFF"/> 
      <action android:name="android.intent.action.SCREEN_ON"/> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name=".services.SOSService" 
     android:enabled="true"> 
    </service> 

接收机和服务,我BroadcastReceiver class

public class SOSBroadcastReceiver extends BroadcastReceiver 
{ 

    private static long lastTriggerTime = 0; 
    private static final int ONE_MILLI = 1000; 
    protected static final long ONE_SEC = 1 * ONE_MILLI; 
    protected static final long TWO_SEC = 2 * ONE_MILLI; 
    protected static final long THREE_SEC = 3 * ONE_MILLI; 
    protected static final int TRIGGER_THRESHOLD = 3; 

    protected static boolean triggerInProgress = false; 

    protected static int triggerCounter = 0; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().contains(Intent.ACTION_SCREEN_ON)) 
     { 
      if (!triggerInProgress) 
      { 
       checkAndCreateAlert(context); 
      } 

     } 
     else if (intent.getAction().contains(Intent.ACTION_SCREEN_OFF)) 
     { 
      if (!triggerInProgress) 
      { 
       checkAndCreateAlert(context); 
      } 
     } 
    } 

    private void checkAndCreateAlert(Context context) 
    { 

     /*---- If the gap between power button press is less than 2 seconds ----*/ 
     if ((System.currentTimeMillis() - lastTriggerTime) <= TWO_SEC 
       || (triggerCounter == 0)) 
     { 
      triggerCounter++; 
      lastTriggerTime = System.currentTimeMillis(); 
     } 
     else 
     { 
      triggerCounter = 0; 
     } 

     if (triggerCounter > TRIGGER_THRESHOLD) 
     { 
      ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); 
      triggerInProgress = true; 

      Intent intent = new Intent(context, SOSActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      intent.putExtra("timer", true); 
      context.startActivity(intent); 

      triggerInProgress = false; 
      triggerCounter = 0; 
     } 
    } 
} 

我的代码将保持电源按钮点击的次数在screen_on和screen_off事件的条款和执行其他方法,如果电源按钮在2秒内按下3次以上。

这是我Service class

public class SOSService extends Service 
    { 
    BroadcastReceiver mReceiver; 
    IntentFilter pqrs_intentFilter; 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() 
    { 

     unregisterReceiver(mReceiver); 

    } 

    @Override 
    public void onStart(Intent intent, int startid) 
    { 

     pqrs_intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 
     pqrs_intentFilter.addAction(Intent.ACTION_SCREEN_ON); 

     mReceiver = new SOSBroadcastReceiver(); 
     registerReceiver(mReceiver, pqrs_intentFilter); 
    } 

    public void onStop(Intent intent) 
    { 
     unregisterReceiver(mReceiver); 
    } 
} 
+0

此代码仅与侧面电源按钮点击一起使用? –

+0

因为在我的代码中,当用户按下中心按钮回家时,它会触发一个事件 –

+0

谢谢让我试一下这段代码。 –

0
public class ExampleActivity extends Activity { 

    @Override 
    protected void onCreate() { 
     // INITIALIZE RECEIVER 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
     // YOUR CODE 
    } 

    @Override 
    protected void onPause() { 
     // WHEN THE SCREEN IS ABOUT TO TURN OFF 
     if (ScreenReceiver.wasScreenOn) { 
      // THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE 
      System.out.println("SCREEN TURNED OFF"); 
     } else { 
      // THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED 
     } 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     // ONLY WHEN SCREEN TURNS ON 
     if (!ScreenReceiver.wasScreenOn) { 
      // THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE 
      System.out.println("SCREEN TURNED ON"); 
     } else { 
      // THIS IS WHEN ONRESUME() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED 
     } 
     super.onResume(); 
    } 

} 

接收机

public class ScreenReceiver extends BroadcastReceiver { 

    private boolean screenOff; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      screenOff = true; 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenOff = false; 
     } 
     Intent i = new Intent(context, UpdateService.class); 
     i.putExtra("screen_state", screenOff); 
     context.startService(i); 
    } 

} 

服务

public static class UpdateService extends Service { 

     @Override 
     public void onCreate() { 
      super.onCreate(); 
      // REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC 
      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      BroadcastReceiver mReceiver = new ScreenReceiver(); 
      registerReceiver(mReceiver, filter); 
     } 

     @Override 
     public void onStart(Intent intent, int startId) { 
      boolean screenOn = intent.getBooleanExtra("screen_state", false); 
      if (!screenOn) { 
       // YOUR CODE 
      } else { 
       // YOUR CODE 
      } 
     } 
} 

希望这是有用的。如果您有任何问题,请告诉我。

+0

我使用相同的代码,我只想要侧电源按钮单击此代码是在主页按钮上触发点击也。 –

相关问题