检测android中的用户活动

Jun*_*dge 6 android user-interaction

我想检测用户最后一次与屏幕交互的时间.我对任何恶意软件/间谍软件都不感兴趣,只需要计算自用户上次点击屏幕以来经过了多长时间.

目标是实现类似于键盘锁的功能.

我一直在做一些研究,并在网站上进行一些问答(例如Android最佳方式检测和处理用户不活动,Android:检测用户的一般用途等)但是当涉及到检测用户在android中的交互时我避开了找不到我需要的东西.

提前致谢.

Jun*_*dge 11

经过一些研究和测试后,我成功地提出了一个解决方案.

我所做的是创建一个后台服务,在其中我获得了一个WindowManager实例,并添加了一个零大小的视图,可以通知用户触摸它之外...但由于视图的大小为零,因此每次都可以调用它.为此我们可以查看https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

所述InactivityService.java类检测每次用户点击屏幕,并将其写入到偏好,以便它可被显示或在应用中的其它组件使用的以后时间.注意我们可以播放时间,或者将其传递给我们的app对象或其他任何适合或需要的解决方案,这是有效的.

/**
 * 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们应该向清单添加以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)

同样有效的是,这种方法与使用ActivityManager获取正在运行的任务相结合是确定用户是否正在与手机交互的一种非常有效的方法.

  • 使用`SYSTEM_ALERT_WINDOW`权限,您将失去注重安全性的用户.我从不安装请求它的应用程序,并建议其他人也这样做.在这种特殊情况下,似乎没有任何重大的隐私问题,因为提供给你的`MotionEvent`是lobotomized(基于4.4模拟器上的光测试).我不知道你是否会遇到其他使用同样技术的应用程序的问题(例如,他们得到事件而不是你),但这不应该是该领域常见的所有事情. (2认同)