Android
Overlay-vensters maken (altijd bovenaan)
Zoeken…
Pop-up overlay
Om uw weergave bovenaan elke toepassing te plaatsen, moet u uw weergave toewijzen aan de overeenkomstige vensterbeheerder. Daarvoor heeft u de systeemwaarschuwingsrechten nodig, die u kunt aanvragen door de volgende regel aan uw manifestbestand toe te voegen:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Opmerking: als uw toepassing wordt vernietigd, wordt uw weergave verwijderd uit de vensterbeheerder. Daarom is het beter om de weergave te maken en toe te wijzen aan de windowmanager door een voorgrondservice.
Een weergave toewijzen aan de WindowManager
U kunt een exemplaar van Window Manager als volgt ophalen:
WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Om de positie van uw weergave te definiëren, moet u enkele lay-outparameters als volgt maken:
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
Nu kunt u uw weergave samen met de gemaakte lay-outparameters als volgt toewijzen aan de window manager-instantie:
mWindowManager.addView(yourView, mLayoutParams);
Voila! Uw weergave is succesvol boven alle andere toepassingen geplaatst.
Opmerking: uw weergave wordt niet bovenop de toetsenblok geplaatst.
SYSTEM_ALERT_WINDOW machtiging verlenen voor Android 6.0 en hoger
Vanaf Android 6.0 moet deze toestemming dynamisch worden verleend,
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Het gooien van onderstaande toestemming geweigerd fout op 6.0,
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type
Oplossing :-
Verzoek om overlay-toestemming zoals hieronder,
if(!Settings.canDrawOverlays(this)){
// ask for setting
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}
Controleer het resultaat,
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_OVERLAY_PERMISSION) {
if (Settings.canDrawOverlays(this)) {
// permission granted...
}else{
// permission not granted...
}
}
}