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