#android #service #touch
#Android #Обслуживание #коснитесь
Вопрос:
Я разработал приложение для сбора событий касания в классе обслуживания переднего плана. Основное действие приложения заключается в вводе информации пользователя (например, имени и возраста). Затем, когда пользователь выбирает кнопку «ВЫПОЛНИТЬ» в пунктах меню, служба переднего плана начинает собирать события касания, и запускается уведомление, информирующее пользователя о том, что служба запущена.
Это основной код действия
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case R.id.run_catch:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent = new Intent(this, SensorService.class);
this.startForegroundService(intent);
setStartPreferences(true);
isStart = true;
} else {
intent = new Intent(this, SensorService.class);
this.startService(intent);
setStartPreferences(true);
isStart = true;
}
break;
case R.id.stop_catch:
intent = new Intent(getApplicationContext(), SensorService.class);
stopService(intent);
setStartPreferences(false);
isStart = false;
break;
}
return super.onOptionsItemSelected(item);
}
Внутри функции Oncreate класса обслуживания я инициализировал функцию касания, используя новую «Линейную компоновку» с помощью «WindowManger».
Это код класса обслуживания:
public class SensorService extends Service implements SensorEventListener, LocationListener, View.OnTouchListener{
//Touch
private WindowManager windowManager;
private LinearLayout touchLayout;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
try {
initTouch();
} catch (Exception e) {
e.printStackTrace();
}
notification();
}
public void initTouch() { //Touch
touchLayout = new LinearLayout(getApplicationContext());
touchLayout.setOnTouchListener(this);
windowManager = ((WindowManager) getSystemService(WINDOW_SERVICE));
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
touchLayout.setLayoutParams(params);
windowManager.addView(touchLayout, params);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Toast.makeText(this, "Touch Event occur" "n" motionEvent.getX() "n" motionEvent.getY(), Toast.LENGTH_SHORT).show();
return true;
}
Я также пытался вызвать функцию initTouch () изнутри «onStartCommand ()», но все еще не работает.
Может ли кто-нибудь помочь мне получить события касания (например, координаты X, Y касаний) пользователя при взаимодействии с линейным макетом нашего приложения (или другими приложениями на смартфоне), пока приложение работает в классе обслуживания?
Комментарии:
1. Проблема заключалась в типе флага, который я использовал. В деталях, поскольку я использую Android API28 версии 9, «WindowManager. Параметры компоновки. TYPE_PHONE» устарел и заменен на «WindowManager. Параметры компоновки. TYPE_APPLICATION_OVERLAY». Тогда я могу правильно получать события касания, такие как значения X и Y касаний, но ТОЛЬКО для базового приложения; касания СНАРУЖИ всегда возвращают нулевые значения. Кто-нибудь может помочь?