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