JavascriptProva

lunedì 5 novembre 2018

Codice per un service con una floatingView in overlay

Ecco tutto il codice del Service che fa apparire una floating view in overlay:
public class Servizio extends Service {
    int deltaX, deltaY;
    private View mFloatingView;
    private WindowManager windowManager;
    private WindowManager.LayoutParams wParams;
    public Servizio() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        wParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        wParams.gravity = Gravity.TOP | Gravity.LEFT;
        wParams.x=300;
        wParams.y=600;

        mFloatingView=LayoutInflater.from(this).inflate(R.layout.widget,null);

        windowManager.addView(mFloatingView,wParams);


        mFloatingView.setOnTouchListener(new View.OnTouchListener() {


            @Override
            public boolean onTouch(View view, MotionEvent event) {

                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:

                        deltaX = (int) event.getRawX() - wParams.x;
                        deltaY = (int) event.getRawY() - wParams.y;

                        return true;

                    case MotionEvent.ACTION_MOVE:
                        wParams.x =(int)event.getRawX()-deltaX;
                        wParams.y = (int)event.getRawY()-deltaY;
                        windowManager.updateViewLayout(mFloatingView,wParams);
                        return true;
                }
                return false;
            }
        });
        


    }
}
Questo codice viene chiamato dall'activity principale in questo modo:
        Intent intent=new Intent(getApplicationContext(),Servizio.class);
        startService(intent);

Per completezza, scrivo per intero il codice della MainActivity in modo da mostrare il codice per i permessi a runtime del disegno in overlay (non valido e quindi ignorato, come già mostrato nel video) in un dispositivo con API < 23.
public class MainActivity extends AppCompatActivity {


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

        Runnable runnable = new Runnable() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void run() {
                if(Settings.canDrawOverlays(getApplicationContext())){
                    Intent i = new Intent(getApplicationContext(),MainActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(i);
                }else{
                    new Handler().postDelayed(this,1000);
                }
            }
        };


        if(Build.VERSION.SDK_INT >= 23 ){
            if(!Settings.canDrawOverlays(getApplicationContext())){
                Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
                startActivity(i);
                new Handler().postDelayed(runnable,1000);
            }
        }

        Intent intent=new Intent(getApplicationContext(),Servizio.class);
        startService(intent);

    }

}
Il codice è quello marcato in bianco su blu.

Nessun commento:

Posta un commento