I am making an android application which needs to detect the event of device power button press twice/thrice & send an SMS in the background. The listener should run in the background (i.e even if my app is not open, it should detect the keypress event and act accordingly).
Below is my tried code which is not working...
My Code:
public class MyBroadCastReciever extends BroadcastReceiver {
int Count=0;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Count++;
if(Count==2){
//Send SMS code..
}
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
//This is for screen ON option.
}
}
Manifest file:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".MyBroadCastReciever" >
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
</receiver>
</application>
This is something I have done,
short description
: You just have to detect when the screen turn off
and turns on
calculate the time difference between them, if its less than 4 seconds(in my case
) send the message else don't .
P.S- You can change the intervals of
pressing of power buttons
.
use it in your BroadcastReceiver
:
@Override
public void onReceive(final Context context, final Intent intent) {
cntx = context;
vibe = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
Log.v("onReceive", "Power button is pressed.");
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
a = System.currentTimeMillis();
seconds_screenoff = a;
OLD_TIME = seconds_screenoff;
OFF_SCREEN = true;
new CountDownTimer(5000, 200) {
public void onTick(long millisUntilFinished) {
if (ON_SCREEN) {
if (seconds_screenon != 0 && seconds_screenoff != 0) {
actual_diff = cal_diff(seconds_screenon, seconds_screenoff);
if (actual_diff <= 4000) {
sent_msg = true;
if (sent_msg) {
Toast.makeText(cntx, "POWER BUTTON CLICKED 2 TIMES", Toast.LENGTH_LONG).show();
vibe.vibrate(100);
seconds_screenon = 0 L;
seconds_screenoff = 0 L;
sent_msg = false;
}
} else {
seconds_screenon = 0 L;
seconds_screenoff = 0 L;
}
}
}
}
public void onFinish() {
seconds_screenoff = 0 L;
}
}.start();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
a = System.currentTimeMillis();
seconds_screenon = a;
OLD_TIME = seconds_screenoff;
new CountDownTimer(5000, 200) {
public void onTick(long millisUntilFinished) {
if (OFF_SCREEN) {
if (seconds_screenon != 0 && seconds_screenoff != 0) {
actual_diff = cal_diff(seconds_screenon, seconds_screenoff);
if (actual_diff <= 4000) {
sent_msg = true;
if (sent_msg) {
Toast.makeText(cntx, "POWER BUTTON CLICKED 2 TIMES", Toast.LENGTH_LONG).show();
vibe.vibrate(100);
seconds_screenon = 0 L;
seconds_screenoff = 0 L;
sent_msg = false;
}
} else {
seconds_screenon = 0 L;
seconds_screenoff = 0 L;
}
}
}
}
public void onFinish() {
seconds_screenon = 0 L;
}
}.start();
}
}
private long cal_diff(long seconds_screenon2, long seconds_screenoff2) {
if (seconds_screenon2 >= seconds_screenoff2) {
diffrence = (seconds_screenon2) - (seconds_screenoff2);
seconds_screenon2 = 0;
seconds_screenoff2 = 0;
} else {
diffrence = (seconds_screenoff2) - (seconds_screenon2);
seconds_screenon2 = 0;
seconds_screenoff2 = 0;
}
return diffrence;
}
}
manifest.xml
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.ACTION_SHUTDOWN" >
</action>
</intent-filter>
</receiver>
<service
android:name=".MyService"
android:exported="false" />
paste it in application
tag
its works fine for me in background too
Here's the code I'm using to detect if the user is present, screen on/off.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.userpresent"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.userpresent.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.userpresent.LockService" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</service>
</application>
</manifest>
MainActivity.java
package com.example.userpresent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(getApplicationContext(), LockService.class));
}
}
LockService.java
package com.example.userpresent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.IBinder;
public class LockService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
final BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
return super.onStartCommand(intent, flags, startId);
}
public class LocalBinder extends Binder {
LockService getService() {
return LockService.this;
}
}
}
ScreenReceiver.java
package com.example.userpresent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
public class ScreenReceiver extends BroadcastReceiver {
public static boolean wasScreenOn = true;
@Override
public void onReceive(final Context context, final Intent intent) {
Log.e("LOB","onReceive");
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// do whatever you need to do here
wasScreenOn = false;
Log.e("LOB","wasScreenOn"+wasScreenOn);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// and do whatever you need to do here
wasScreenOn = true;
} else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)){
Log.e("LOB","userpresent");
Log.e("LOB","wasScreenOn"+wasScreenOn);
String url = "http://www.stackoverflow.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setData(Uri.parse(url));
context.startActivity(i);
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With