Con l'occasione, ripasso il "trucco" per non dover riavviare il programma una volta concesso il permesso a runtime per gli overlay.
Iniziamo da qui:
public class MainActivity extends AppCompatActivity {
Intent i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Ora, devo inserire il codice per i permessi.Innanzitutto non deve mancare mai il classico permesso nel manifest!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.antonello.studiooverlay">
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Quindi ci sono i permessi a runtime.
Approfitto dell'occasione per ripassare un po' i "meccanismi" della cosa...
Se l'API è uguale o superiore alla 23, se contemporaneamente non è impostato il permesso di Overlay (!Settings.canDrawOverlays(getApplicationContext())), si crea un intent avente per parametri ACTION_MANAGE_OVERLAY_PERMISSION e Uri.parse(...col nome del package...).
Questo dovrebbe bastare a cambiare le carte in tavola dopo aver chiamato startActivity(intent).
Però sempre dopo aver riavviato l'applicazione.
Ecco il codice:
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);
}
}
Ora applichiamo il "trucco".
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);
}
}
}
}
Ora realizzo un video con due emulatori aventi rispettivamente API 22 e API 23 per metterne in luce le differenze di comportamento.
Nessun commento:
Posta un commento