JavascriptProva

domenica 4 novembre 2018

Ancora sul trucco per non riavviare l'applicazione dopo i permessi a runtime per l'overlay

Views in overlay.
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