1. AndroidManifest.xml

 
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 

 

2. GlobalTouchService.java


import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;


public class GlobalTouchService extends Service implements OnTouchListener{

    private String TAG = this.getClass().getSimpleName();    
    private WindowManager mWindowManager;
    private LinearLayout touchLayout;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();

        Log.e(TAG, "Begin GlobalTouchService onCreate ");
        
        touchLayout = new LinearLayout(this); // create linear layout        
        LayoutParams lp = new LayoutParams(100, LayoutParams.MATCH_PARENT); // set layout width 30 px and height is equal to full screen
        touchLayout.setLayoutParams( lp);
        touchLayout.setBackgroundColor( Color.CYAN); // set color if you want layout visible on screen
        
        touchLayout.setOnTouchListener(this); // set on touch listener

        int LAYOUT_FLAG;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
        }//if
        
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);      // fetch window manager object        
        WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(    // set layout parameter of window manager
                100,                                                        // width of layout 30 px
                WindowManager.LayoutParams.MATCH_PARENT,                        // height is equal to full screen
                LAYOUT_FLAG,                                                    // 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;
        mWindowManager.addView(touchLayout, mParams);
        Log.e(TAG, "End GlobalTouchService onCreate");
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "End GlobalTouchService onDestroy");
        if( mWindowManager != null) {
            if(touchLayout != null) 
                mWindowManager.removeView(touchLayout);
        }//if
        super.onDestroy();
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.e(TAG, "Action :" + event.getAction() + "\t X :" + event.getRawX() + "\t Y :"+ event.getRawY());
        if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)
            Log.e(TAG, "Action :" + event.getAction() + "\t X :" + event.getRawX() + "\t Y :"+ event.getRawY());
        return true;
    }

}


3. MainActivity.java


import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Intent globalService;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Context context = this;

        // 다른 앱 위에 그리기 권한 설정.
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.i("TEST", "Permission Granted ? " + Settings.canDrawOverlays(context));
            // M 이상에서만 퍼미션 확인(그 이하에서는 자동으로 허용됨)
            // 다른 앱 위에서 그리기 권한에 대한 허용 여부 체크
            if(Settings.canDrawOverlays(context)) { // 이미 권한 설정 되어있음
                globalService = new Intent(context, GlobalTouchService.class);
                context.startService( globalService);
            } else { // 권한 없음
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()));
                context.startActivity(intent);    // startActivityForResult로 대체 가능
            }//if
        }//if
    }

    public void buttonClicked(View v) {
        if( v.getTag() == null) {
            startService(globalService);
            v.setTag("on");
            Toast.makeText(this, "Start Service", Toast.LENGTH_SHORT).show();
            Log.e("buttonClicked", "Start Service");
        } else {
            stopService(globalService);
            v.setTag(null);
            Toast.makeText(this, "Stop Service", Toast.LENGTH_SHORT).show();
            Log.e("buttonClicked", "Stop Service");
        }//if
    }

}

4. mainactivity.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Start Touch Detection"
        android:onClick="buttonClicked" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

+ Recent posts