我想检测出用户最后一次与屏幕进行交互的时间。我对做任何恶意软件/间谍软件都不感兴趣,只需要计算自用户上次在屏幕上轻按以来已经经过了多少时间。
目的是实现类似于键盘锁的功能。
我一直在做一些研究,并在网站上进行一些问答(例如Android最佳检测和处理用户不活动的方法,Android:检测用户的一般使用情况等),但是要检测android中的用户交互,我还没有找不到我需要的。
提前致谢。
经过更多的研究和测试,我设法找到了解决方案。
我要做的是创建一个后台服务,在该服务中,我获取WindowManager的实例,并添加一个零尺寸的视图,该视图可从其外部通知用户触摸...但是由于该视图的尺寸为零,因此每次都可以调用该视图。为此,我们可以检查https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html
所述InactivityService.java类检测每次用户点击屏幕,并将其写入到偏好,以便它可被显示或在应用中的其它组件使用的以后时间。请注意,我们可以广播时间,也可以将其传递给我们的应用程序对象或任何其他适合或需要的解决方案,这是很有效的。
/**
* Detects user taps on screen (user interaction).
*
* @author Junior Buckeridge A.
*
*/
public class InactivityService extends Service {
protected static final String LOG_TAG = InactivityService.class.getSimpleName();
private boolean isAdded = false;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(!isAdded){
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
0, 0, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
View view = new View(this);
view.setOnTouchListener(new OnTouchListener() {
@SuppressLint("DefaultLocale")
@Override
public boolean onTouch(View v, MotionEvent event) {
GregorianCalendar calendar = new GregorianCalendar();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(InactivityService.this);
String log = prefs.getString(LOG_KEY, "");
log = String.format("User interaction detected at: %02d:%02d:%02d \n%s",
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND),
log);
prefs.edit().putString(LOG_KEY, log).commit();
return false;
}
});
wm.addView(view, params);
}
return START_STICKY;
}
}
我们应该为清单添加以下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
值得一提的是,这种方法与使用ActivityManager获取正在运行的任务相结合,是一种确定用户是否正在与手机进行交互的非常有效的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句