在Android中检测用户活动

少年Buckeridge

我想检测出用户最后一次与屏幕进行交互的时间。我对做任何恶意软件/间谍软件都不感兴趣,只需要计算自用户上次在屏幕上轻按以来已经经过了多少时间。

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

我一直在做一些研究,并在网站上进行一些问答(例如Android最佳检测和处理用户不活动的方法Android:检测用户的一般使用情况等),但是要检测android中的用户交互,我还没有找不到我需要的。

提前致谢。

少年Buckeridge

经过更多的研究和测试,我设法找到了解决方案。

我要做的是创建一个后台服务,在该服务中,我获取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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检测快速的用户活动

来自分类Dev

在任何VC中检测用户不活动

来自分类Dev

在任何VC中检测用户不活动

来自分类Dev

如何检测用户不活动?

来自分类Dev

在Android中获取当前的活动用户

来自分类Dev

Android:所有活动中的用户信息

来自分类Dev

Android-如何检测堆栈中的最终活动

来自分类Dev

在Android / PhoneGap应用中检测屏幕空闲或活动

来自分类Dev

在WebView Android中检测到URL时如何更改活动

来自分类Dev

使用Android检测用户活动(跑步,骑自行车,开车)

来自分类Dev

如何使用JavaScript检测用户不活动?

来自分类Dev

自上次在 macOS 中输入 NSTextView 以来,如何检测用户不活动?

来自分类Dev

在C中检测网络活动

来自分类Dev

如何确认用户何时更改 android 中的活动

来自分类Dev

在Android中按用户检测锁定屏幕错误密码

来自分类Dev

Android:创建“首次用户”活动

来自分类Dev

检查用户活动状态 - Android

来自分类Dev

检测正常Android活动上的刷卡

来自分类Dev

如何在Android应用程序中检测全局不活动?

来自分类Dev

检测应用程序的用户当前是否在 Windows Server 2008 R2 中处于活动状态

来自分类Dev

在CouchDB中存储用户活动

来自分类Dev

在pygame中检测用户事件

来自分类Dev

检测Java中的硬盘活动

来自分类Dev

如何在Crostini中检测活动窗口?

来自分类Dev

WPF如何有效地检测用户活动

来自分类Dev

MiniFilter-如何仅检测用户发起的I / O活动?

来自分类Dev

android中的活动流程

来自分类Dev

Android中的Ghost活动

来自分类Dev

Android中的Webview活动