Получение данных касания в классе обслуживания в Android studio

#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 касаний, но ТОЛЬКО для базового приложения; касания СНАРУЖИ всегда возвращают нулевые значения. Кто-нибудь может помочь?