AndroidStudio后台服务如何检测屏幕是否被触摸?
How to detect whether screen is touched in a background service in Android Studio?
我正在 android 工作室做一个项目。 我需要在后台服务中检测屏幕是否被触摸(并为此弹出一条消息)。 但是,在不影响用户使用智能的情况下,我无法在后台服务中检测屏幕是否被触摸phone。
当我说 "detect in background" 时,我的意思是应用程序的效果不会干扰用户在屏幕上的操作。我下面的进度应该可以解释我在这里的意思:
我制作了一个应用程序,它通过在 android 中实现 onTouchListener 并为该 onTouchListener 使用布局来检测用户是否在后台触摸屏幕。我按照网站上的说明做到了这一点
“http://kpbird.blogspot.com.au/2013/03/android-detect-global-touch-event.html”
我对布局进行了一些更改以覆盖整个屏幕,以便它可以检测到整个屏幕。
但是,在我 运行 我的应用程序创建了不断检测屏幕触摸的服务之后,每次当用户触摸屏幕时,该触摸都会被我的服务(布局)吸收,所以用户无法再正确使用它们的 phone(例如按图标启动其他应用程序)。这是因为布局覆盖了整个屏幕并阻止了其下方图标的任何触摸信息(布局检测屏幕触摸),因此图标不知道有触摸,因此不会对用户做出反应。但我希望我的应用程序和服务允许用户正常使用他们的 phone。
我听说 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 方法。只是 return false 并且触摸不会被您的应用吸收。
另请检查:
编辑:
这可能不是你想要的,但如果你有 root 设备,你可以这样做:
adb shell getevent dev/input/event1
在我的例子中,event1 负责触摸事件,但它可能有所不同。
我正在 android 工作室做一个项目。 我需要在后台服务中检测屏幕是否被触摸(并为此弹出一条消息)。 但是,在不影响用户使用智能的情况下,我无法在后台服务中检测屏幕是否被触摸phone。
当我说 "detect in background" 时,我的意思是应用程序的效果不会干扰用户在屏幕上的操作。我下面的进度应该可以解释我在这里的意思:
我制作了一个应用程序,它通过在 android 中实现 onTouchListener 并为该 onTouchListener 使用布局来检测用户是否在后台触摸屏幕。我按照网站上的说明做到了这一点 “http://kpbird.blogspot.com.au/2013/03/android-detect-global-touch-event.html” 我对布局进行了一些更改以覆盖整个屏幕,以便它可以检测到整个屏幕。
但是,在我 运行 我的应用程序创建了不断检测屏幕触摸的服务之后,每次当用户触摸屏幕时,该触摸都会被我的服务(布局)吸收,所以用户无法再正确使用它们的 phone(例如按图标启动其他应用程序)。这是因为布局覆盖了整个屏幕并阻止了其下方图标的任何触摸信息(布局检测屏幕触摸),因此图标不知道有触摸,因此不会对用户做出反应。但我希望我的应用程序和服务允许用户正常使用他们的 phone。
我听说 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 方法。只是 return false 并且触摸不会被您的应用吸收。
另请检查:
编辑: 这可能不是你想要的,但如果你有 root 设备,你可以这样做:
adb shell getevent dev/input/event1
在我的例子中,event1 负责触摸事件,但它可能有所不同。