View über andere Apps anzeigen

  • Antworten:12
  • Bentwortet
hub
  • Forum-Beiträge: 9

21.10.2019, 10:16:27 via Website

Hallo,

wie kann man ein Textview oder einen Button anzeigen, die immer sichtbar sind, während andere Apps laufen.
Also immer im Vordergrund sind, obwohl ich in einer anderen App bin.

Kommentieren
Beste Antwort
hub
  • Forum-Beiträge: 9

24.10.2019, 20:27:13 via Website

Habe nach langem Suchen das Beispiel zum Laufen gebracht.

Es lag nicht an der Berechtigung.
Diese muss zwar auch vorhanden sein, aber die hatte ich testweise in den Einstellungen schon von Hand gesetzt. Ab da hätte die App funktionieren müssen.

Es lag beim „WindowManager“ an der Konstate „LayoutParams.TYPE_SYSTEM_ALERT“.
Diese muss durch „LayoutParams.TYPE_APPLICATION_OVERLAY” ersetzt werden.

s. developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_SYSTEM_ALERT

Danke an Alle für die tolle Unterstützung.

Hilfreich?
Pascal P.
Kommentieren
hub
  • Forum-Beiträge: 9

22.10.2019, 17:13:27 via Website

Danke für die Beispiele.

Das erste Beispiel läuft bei mir so wie ich es bräuchte.
Allerdings nur bis Android V5
Bräuchte aber V9 oder V10

Mit dem 2. Link komme ich nicht klar.
Bin Android-Anfänger und weiß dann immer nicht, wo einzelne Code-Segmente genau hingehören.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

22.10.2019, 18:29:54 via Website

Hallo
Das das erste Beispiel ab ABI 23 nicht mehr läuft liegt mit hoher Wahrscheinlichkeit an den geänderten Permission von API 23.
Ab API 23 brauchst du auch die Bestätigung vom User zu Laufzeit.
Manifest reicht nicht mehr aus.

https://developer.android.com/training/permissions/requesting

SYSTEM_ALERT_WINDOW gehört zu den Dangerous / Signature eingestuften Permission.

https://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

— geändert am 22.10.2019, 18:53:39

Hilfreich?
hubPascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

22.10.2019, 18:36:09 via Website

Mit dem zweiten Beispiel holst du dir eigentlich die Permissen vom User das brauchst du ab API 23.

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    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);
    } else { 
    Intent svc = new Intent(this, OverlayShowingService.class);
        startService(svc);
        finish();
{

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_OVERLAY_PERMISSION) {
        if (Settings.canDrawOverlays(this)) {
            // permission granted...
        Intent svc = new Intent(this, OverlayShowingService.class);
        startService(svc);
        finish();

        }else{
            // permission not granted...
            // fehler ausgeben das Permission nicht erteilt wurde. 
        }
    }
}

— geändert am 22.10.2019, 19:18:33

Hilfreich?
hubPascal P.
Kommentieren
hub
  • Forum-Beiträge: 9

23.10.2019, 16:38:25 via Website

danke für das Verknüpfen der Beispiele.
Ich glaube, den angedachten Ablauf habe ich verstanden.
- Test, ob Berechtigung vorhanden
- bei keiner Berechtigung: Einstellung für Berechtigung aufrufen
- ansonsten meinen Service starten
Bei Rückkehr von den Einstellungen:
- wenn Berechtigung vorhanden, meinen Service starten
- ansonsten Fehlerbehandlung, z.B. Abbruch

Folgende Fragen sind noch:
REQUEST_OVERLAY_PERMISSION: ist das eine Variable, die ich noch definieren muss, oder eine vorgefertigte Konstante, oder … ?

Vor dem Aufruf onActivityResult sind { }
Gehört da noch was rein?

Aber mein Hauptproblem ist, dass der Editor/Compiler den Aufruf onActivityResult() nicht erkennt.
(Variable onActivityResult is never used)
startActivityForResult wird dagegen nicht bemängelt.
Fehlt da vielleicht noch ein Import?
Oder eine Einstellung bei Android Studio?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.10.2019, 16:41:03 via Website

Da musst du uns schon deinen Code zeigen, sonst können wir auch nur raten ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
hub
  • Forum-Beiträge: 9

23.10.2019, 16:47:21 via Website

Habe den Fehler bei onActivityResult gefunden.
(war in onCreate drin)

Bleibt noch die Frage, was REQUEST_OVERLAY_PERMISSION ist.

Code:
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.10.2019, 17:53:52 via App

Eine Integer Konstante die dir den Result Identifiziert.
Musst du selber definieren

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
hub
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

23.10.2019, 18:57:09 via Website

Richtig das ist eine konstante int.
Konstanten werden üblicherweise in nur groß Buchstaben geschrieben. Daran erkennt man konstanten.
Final int....

Das ist eine übliche java Schreibweise.
Klassen Anfang gross.
Konstanten alles gross.

Schaue dir mal die üblichen namenskonventionen an.

Den code habe ich nur aus den zweiten Beispiel kopiert. Mehr nicht.

final int REQUEST_OVERLAY_PERMISSION = 12345;

Am besten am Anfang nach der Klassen Definition im Klassenrumpf.

Ich bin der Meinung gewesen das dies selbst erklärend gewesen ist.

Ps geht es denn nun?

— geändert am 23.10.2019, 19:14:07

Hilfreich?
hub
Kommentieren
Beste Antwort
hub
  • Forum-Beiträge: 9

24.10.2019, 20:27:13 via Website

Habe nach langem Suchen das Beispiel zum Laufen gebracht.

Es lag nicht an der Berechtigung.
Diese muss zwar auch vorhanden sein, aber die hatte ich testweise in den Einstellungen schon von Hand gesetzt. Ab da hätte die App funktionieren müssen.

Es lag beim „WindowManager“ an der Konstate „LayoutParams.TYPE_SYSTEM_ALERT“.
Diese muss durch „LayoutParams.TYPE_APPLICATION_OVERLAY” ersetzt werden.

s. developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_SYSTEM_ALERT

Danke an Alle für die tolle Unterstützung.

Hilfreich?
Pascal P.
Kommentieren
hub
  • Forum-Beiträge: 9

27.10.2019, 16:27:59 via Website

Nachdem jetzt alles soweit läuft, habe ich noch eine Frage, die mir nicht ganz klar ist:
warum braucht man dafür eigentlich einen Service?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

27.10.2019, 18:52:54 via Website

Du brauchst den Service, damit du andere Apps im Vordergund anzeigen kannst.
Sonst kann eine App oder Views davon nur angezeigt werden, wenn eine Activity deiner App geöffnet ist.
Du benötigtst ja aber ein Overlay über anderen Apps, d.h. eine Activity wird nicht angezeigt und ohne Service kann auch kein Overlay angezeigt werden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren