我正在做一个关于Android Studio的项目。我需要在后台服务中检测屏幕是否被触摸(并弹出一条消息)。但是,在不影响用户使用智能手机的情况下,我无法在后台服务中检测屏幕是否被触摸。
当我说“后台检测”时,我的意思是应用程序的效果不会干扰用户在屏幕上所做的事情。我下面的进度应该解释一下我在这里的意思:
我做了一个应用程序,通过在Android系统中实现onTouchListener来检测用户是否在后台触摸屏幕,并使用onTouchListener的布局。我是按照网站“http://kpbird.blogspot.com.au/2013/03/android-detect-global-touch-event.html”中的说明来做到这一点的,我对布局做了一些更改,以覆盖整个屏幕,这样它就可以检测整个屏幕。
但是,在我运行我的应用程序后,该应用程序创建了持续检测屏幕触摸的服务,每次用户触摸屏幕时,该触摸都会被我的服务(布局)吸收,因此用户无法再正确使用手机(例如按图标启动其他应用程序)。这是因为布局覆盖了整个屏幕,并阻止了下方图标的任何触摸信息(布局检测屏幕触摸),因此图标不知道有触摸,因此不会对用户做出反应。但是我希望我的应用程序和服务允许用户正常使用手机。
我听说android中的服务旨在不与用户交互(即屏幕触摸)并在后台工作,但我想知道是否有办法解决这个问题。
下面是我的服务代码:
public class GlobalTouchService extends Service implements OnTouchListener{
private String TAG = this.getClass().getSimpleName();
// window manager
private WindowManager mWindowManager;
// linear layout will use to detect touch event
private LinearLayout touchLayout;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// create linear layout
touchLayout = new LinearLayout(this);
// set layout width 30 px and height is equal to full screen
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
touchLayout.setLayoutParams(lp);
// set color if you want layout visible on screen
//touchLayout.setBackgroundColor(Color.CYAN);
// set on touch listener
touchLayout.setOnTouchListener(this);
// fetch window manager object
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// set layout parameter of window manager
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT, // width is equal to full screen
WindowManager.LayoutParams.MATCH_PARENT, // height is equal to full screen
WindowManager.LayoutParams.TYPE_PHONE, // Type Phone, These are non-application windows providing user interaction with the phone (in particular incoming calls).
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // this window won't ever get key input focus
PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.LEFT | Gravity.TOP;
Log.i(TAG, "add View");
mWindowManager.addView(touchLayout, mParams);
}
@Override
public void onDestroy() {
if(mWindowManager != null) {
if(touchLayout != null) mWindowManager.removeView(touchLayout);
}
super.onDestroy();
}
public void showAlert(View view) {
AlertDialog.Builder myAlertBuilder = new AlertDialog.Builder(this);
myAlertBuilder.setMessage(getString(R.string.alertMessage))
.setTitle(getString(R.string.alertTitle))
.setPositiveButton(getString(R.string.alertPositiveChoice), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setNegativeButton(getString(R.string.alertNegativeChoice), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
onDestroy();
}
});
AlertDialog myAlert = myAlertBuilder.create();
myAlert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
myAlert.show();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)
// Log.i(TAG, "Action :" + event.getAction() + "\t X :" + event.getRawX() + "\t Y :" + event.getRawY());
////////////////////
View myView = null;
//showAlert(myView);
///////////////////////
return false;
}
}
这里有onTouch方法。只要返回false,触摸就不会被你的应用程序所吸收。
另请检查此内容:https://stackoverflow.com/a/6384443/1723095
编辑:这可能不是你想要的,但如果你有根设备,你可以这样做:
adb shell getevent dev/input/event1
在我的例子中,event1负责触摸事件,但它可以有所不同。
我知道如果你想检查是否有人点击了什么,你会这样做 但是我想检查屏幕是否根本没有被点击。为了做到这一点,我会产生什么代码? 此外,作为附带说明,让Android应用程序中的所有类扩展类是个好主意吗?
问题内容: 我试图检测我的sprite节点是否已被触摸并且我不知道从哪里开始。 问题答案: 首先将的属性设置为字符串。 然后在功能上 这是一种方法。 您也可以继承并覆盖其中的内部。 然后做
问题内容: 我正在尝试使用后台服务拍摄屏幕截图。该服务就像一个Facebook聊天头,但是我希望它在单击时拍摄屏幕截图。 预览图片 我已经开发了一些代码,但是没有用。我尝试过的最后一个是: 但是正在将屏幕截图带到我的按钮而不是屏幕上。 我知道问题在这里: 但我不知道如何解决。谁能帮我? 我实际上正在使用Android Studio 2.2.2和Android 4.0或更高版本。 问题答案: 对于L
问题内容: 在Linux中使用屏幕时,如何确定我是否在屏幕中?如果可以,我可以退出屏幕,但是如果没有,那么我将关闭终端。 在执行操作时,我可以查看是否还连接了其他屏幕,但是如何知道我的当前终端是否是这些已连接屏幕之一? 问题答案: 检查。如果为空,则您位于“真实”终端上。如果包含任何内容,则为您所在屏幕的名称。 如果您不在屏幕上: 如果您在屏幕上:
在过去的几天里,我一直在将我的游戏(Apopalypse)移植到Android Mobile平台。我在Google上快速搜索了精灵触摸检测,但没有找到任何有用的东西。每个气球触摸一次就会弹出,我只需要检测它是否被触摸。这是我的气球生成代码: 渲染(x、y、宽度和高度随机): 在主游戏类中产卵:
问题内容: 在不使用触摸屏设备的情况下,使用媒体查询最安全的方法是什么?如果无法解决,您是否建议使用JavaScript解决方案,例如Modernizr或Modernizr? 问题答案: 我建议使用modernizr并使用其媒体查询功能。 但是,使用CSS时,存在伪类,例如Firefox。您可以使用:-moz-system-metric(touch- enabled)。但是,并非所有浏览器都提供这