Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android-Version herausfinden? (https://www.delphipraxis.net/192436-android-version-herausfinden.html)

sko1 18. Apr 2017 15:52

Android-Version herausfinden?
 
Hallo,

ich google (vielleicht mir falschen Suchbegriffen) seit Stunden, wie kann ich in einer Android-App die Android-Version des Handys / Tablets herausfinden, zusätzlich am besten auch noch den Prozessortyp...

Ich habe das Problem, dass es Anwender gibt die versuchen, meine App auf einem Samsung Galaxy Tab 3 (mit Android 4.1.3 und Intel Prozessor) zu installieren, was auch geht, nur dann beendet sich die App von allein ("App wurde angehalten").

Ich wollte dann wenigstens noch eine Meldung ausgeben, dass Android-Version und / oder Prozessor nicht unterstützt werden.

Ich habe solch ein teil hier liegen, eine Mini-App mit einem Button und ShowMessage('Hallo') funktioniert, aber schon das Debuggen ist nicht möglich, schwarzer Bildschirm und irgendwann "Anwendung reagiert nicht, Beenden" ...

Ciao
Stefan

BrightAngel 18. Apr 2017 16:17

AW: Android-Version herausfinden?
 
Ich habe keine Ahnung, ob dir das hilft, aber zwei Minuten google haben bei mir das hier zu Tage gefördert. Habe daraufhin mal hier nachgeschlagen und eventuell ist das, was du brauchst :P

Oder suchst du das speziell für Delphi?

[edit1]
Die schreiben:
Zitat:

Information about the current build, extracted from system properties.
Eventuell bekommt man die noch wo anders her... Hm.
[/edit1]

[edit2]
Was ist mit dem hier[bzw. verlinktes Doc]? Kann das leider hier grade nicht testen...
[/edit2]

Brighty

Rollo62 18. Apr 2017 17:07

AW: Android-Version herausfinden?
 
Schau auch mal hier ob da für dich was dabei ist ...

Rollo

mensch72 18. Apr 2017 17:27

AW: Android-Version herausfinden?
 
wenn du nicht willst, das deine APP für "X86" Geräte im AppStore erscheint, dann schmeiße manuell die Embacadero Dummys für MIPS und X86 aus dem APK.

Wenn du es ganz sauber lösen willst, schreibe dir selbst eine "LoaderAPP" per AndroidStudio in Java, da kannst du testen welche Version und welche CPU... Tipp: blockiere für DelphiNDK alles was kleiner 4.4.x(API19) und nicht ARM-CPU ist.


Klar "kann" es gehen, es muss aber nicht und wenn man sich an das hält wofür Delphi freigegeben ist, dann fällt alles andere flach und auch nach oben (z.B. XE6/XE7 auf Android6+) fällt wieder viel in den Bereich "kann gehen", aber dann z.B. XE10.x mit Android6 = "sollte gehen":)

Mavarik 18. Apr 2017 17:33

AW: Android-Version herausfinden?
 
Hallo!

Damit eine FMX App auf Intel läuft muss die Android Version Houdini installiert haben...

Damit es dann funktioniert muss Du noch den Loader ändern...

Hinweis aus meinen blog

Mavarik

sko1 19. Apr 2017 06:41

AW: Android-Version herausfinden?
 
Danke erst mal für die vielen Tips!
Da habe ich erst mal genug zum Lesen und testen...

Leider wird meine App nicht über Google Play verteilt sondern ist "standalone downloadbar" so dass ich keinen Einfluss darauf habe wer das versucht zu installieren.

Ja es ist so dass ich am besten direkt beim Start der App selbst prüfen möchte was da vorhanden ist im System (falls das Programm es überhaupt bis dahin schafft)

Zitat:

Damit eine FMX App auf Intel läuft muss die Android Version Houdini installiert haben...
heißt das da muss das Gerät geflasht werden? Ich glaube nicht das ich das unseren Anwendern "zumuten" kann!

Ciao
Stefan

sko1 19. Apr 2017 07:05

AW: Android-Version herausfinden?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Der Tip mit dem Deviceinfo war erst recht vielversprechend, aber ich bekomme auf dem Samsung Tab3 und einem Samsung S5 die gleiche Angabe zum Prozessor (siehe angehängte Bilder) obwohl das eine ein Intel und das andere ein "echter" Arm-Prozessor ist :-(

Hat jemand noch eine Idee wie ich das besser / genauer spezifizieren kann?

Ciao
Stefan

himitsu 19. Apr 2017 07:28

AW: Android-Version herausfinden?
 
Deviceinfo ist ein Delphi-Programm.
Also es läuft immer nur auf einem ARM oder in der ARM-Emulation auf neueren Intels.

Kann natürlich sein, dass es die "CPU" seiner Laufzeitumgebung anzeigt und das wäre immer ein ARM.
Das Problem gibt es auch bei virtualisierten Windows-Programmen, wo die meisten Version-APIs in einer 32-Bit-Anwendung z.B. x68 anzeigen, obwohl Windows eigentlich ein x64 ist.

sko1 19. Apr 2017 07:34

AW: Android-Version herausfinden?
 
Heißt für mich auf deutsch : "keine Chance"?

Dann müsste ich eine Liste intern pflegen, und die Meldung anhand des Gerätenamens erzeugen?

Ciao
Stefan

mjustin 19. Apr 2017 07:45

AW: Android-Version herausfinden?
 
Ich habe mir die verlinkten Artikel nicht angesehen, aber im Prinzip könnte man die nativen Android API Informationen zur Version auch aus Delphi heraus abfragen können.


Code:
   String manufacturer = Build.MANUFACTURER;
   String model = Build.MODEL;
   int version = Build.VERSION.SDK_INT;
   String versionRelease = Build.VERSION.RELEASE;
(wobei Build im Package android.os liegt, voll qualifiziert also android.os.Build)

(aus: http://stackoverflow.com/a/35073538/6517492)

sko1 19. Apr 2017 09:29

AW: Android-Version herausfinden?
 
Das sind aber eigentlich alles Infos die ich schon habe
- Hersteller
- Modell
- Androidversion

Ciao
Stefan

mjustin 19. Apr 2017 10:06

AW: Android-Version herausfinden?
 
Zitat:

Zitat von sko1 (Beitrag 1368226)
Das sind aber eigentlich alles Infos die ich schon habe
- Hersteller
- Modell
- Androidversion

Ciao
Stefan

Dann fehlt nur die Prozessorarchitektur?

Unter API call to get processor architecture werden diverse Wege / APIs beschrieben

sko1 19. Apr 2017 10:25

AW: Android-Version herausfinden?
 
Wie weiter oben beschrieben scheine ich mit Delphi / FMX gar nicht so weit "nach oben vordringen zu können" und bekomme als Prozessor immer nur das "angeboten" was das OS mit dem Intel Atom Prozessor für mich emuliert!

Ciao
Stefan

mjustin 19. Apr 2017 10:36

AW: Android-Version herausfinden?
 
Zitat:

Zitat von sko1 (Beitrag 1368236)
Wie weiter oben beschrieben scheine ich mit Delphi / FMX gar nicht so weit "nach oben vordringen zu können" und bekomme als Prozessor immer nur das "angeboten" was das OS mit dem Intel Atom Prozessor für mich emuliert!

Was unmöglich "scheint" ist ja gerade das Reizvolle :) Welche der Android APIs einen emulierten Prozessor sehen, und welche nicht, kann man mit etwas Glück auch als Frage auf Stackoverflow posten.

Rollo62 19. Apr 2017 11:13

AW: Android-Version herausfinden?
 
Viellleicht muss man unter "libHoudini" danach suchen, die müssten ja eigentlich so eine Schnittstelle zur Verfügung stellen um festzustellen bin ich "nativ" oder "houdiniert".

Rollo

BrightAngel 19. Apr 2017 13:40

AW: Android-Version herausfinden?
 
Was mich noch wundert: Wenn dein Programm unter ARM läuft, nur emuliert nicht. Was genau geht da schief? Also wenn die CPU effektiv ein ARM ist (auch wenns eigentlich nur emuliert ist), warum überhaupt Interesse an der Realität zeigen? (klar, es stürzt ab, aber dann ist das vielleicht nur was ganz Kleines, was sich vllt einfach fixen lässt :P)

Brighty

sko1 19. Apr 2017 14:10

AW: Android-Version herausfinden?
 
Leider nicht!

Ein Hallo Welt mit einem Button, der dann eine Messagebox anzeigt, funktioniert, aber die App hat Datenbankzugriff (SQLite), SSL Mailkommunikation (Open SSL 1.02h eingebunden wegen Android 6) und und und...

Und Debuggen geht auf dem Device auch nicht, ich sehe es im Explorer, kann da Dateien schieben, ich sehe es als Device im RAD Studio und kann über "Starten" auch die App aufs Device laden und ausführen, aber beim Debuggen wird Anwendung aufgerufen und ab da passiert nichts mehr, Tablet bleibt schwarz und irgendwann "reagiert nicht mehr, Beenden..."?

Und nun auf Verdacht Routinen umbauen, Compilieren, runterladen, testen, ... fehlt mir die Zeit, Momentan habe ich 'zig Stellen wo ein neues Formular erzeugt wird und "Anwendung wurde beendet" erscheint, es gibt aber andere Formulare die sich anzeigen lassen, ein System konnte ich nicht erkennen und ohne Debuggen wird das nicht lösbar!

Ist ein Formular erst mal da gibt es Funktionen die funktionieren und andere wo die App einfach beendet wird.

Alle relevanten Codestellen sind mit Try / Except versehen und schreiben eigentlich eine Fehler-Logdatei, auf dem betreffenden Device aber ist diese leer!

Ciao
Stefan

BrightAngel 19. Apr 2017 14:17

AW: Android-Version herausfinden?
 
Wie sieht es in der Devicesimulation auf dem Desktop aus? Funktioniert es da? Ich kenne mich nicht in der Tiefe aus, aber dort kann man ja auch von x86 auf ARM emulieren, oder?

Brighty

sko1 19. Apr 2017 14:24

AW: Android-Version herausfinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das kann ich Dir nicht beantworten, ich habe lange vergeblich versucht, einen "vernünftig laufenden Emulator" für RAD Studio zu finden, alles was ich hatte brauchte zum Starten 5 Minuten und war so was von grottenlangsam, das Thema habe ich dann nicht mehr weiter verfolgt.

Da die Emulation auf dem PC jedoch was ganz anderes ist als Intel da mit seinem Atom-Prozessor und Samsung mit seinem Android 4.4.2 macht, brauche ich eigentlich keinen Vergleich zur Emulation unter Windows zu probieren!

Ciao
Stefan

Nachtrag:
Ich habe einen alten Emulator rausgekramt, auch da liefert DeviceInfo einen ARM-Prozessor (siehe Anhang) , Betriebssystem ist ein Windows 10 mit Intel Core 5

bra 20. Apr 2017 09:31

AW: Android-Version herausfinden?
 
Ich habe das bei mir so gelöst, dass ich /proc/cpuinfo abfrage und nach "placeholder" suche, das stand dort bei meinen Tests immer drin, wenn die Houdini-Emulation aktiv war.

Wichtig ist, dass bei bei x86 und OpenSSL-Bibliotheken nicht die mit ausgelieferte *.so verwendet wird, sondern die vom System. Unter Houdini funktioniert das Laden von ARM-*.so-Dateien nämlich nicht (zumindest mit Delphi).

Als Android-Emulator kann ich übrigens BlueStacks empfehlen, der läuft ausreichend schnell, nervt nur etwas, weil der immer irgendwelche Apps installiert.

sko1 20. Apr 2017 10:46

AW: Android-Version herausfinden?
 
Zitat:

nicht die mit ausgelieferte *.so verwendet wird,
die vom System heißt die im Android enthaltene?
Das hatte ich ja gemacht, aber ab Android6 funktioniert das nicht mehr!
Daher habe ich die SSL - so-Files vom 1.02h eingebaut.

Zitat:

dass ich /proc/cpuinfo abfrage
hast Du da bitte mal einen Codeschnipsel?

Zitat:

BlueStacks
danke, sehe ich mir gleich mal an!

Ciao
Stefan

sko1 26. Apr 2017 11:22

AW: Android-Version herausfinden?
 
Schöne Schxxxx !

Ich habe den nächsten Anwender wo unsere App nicht läuft, ein Asus Transformer Pad mit NVIDIA Tegra 3 CPU!

Ich konnte nirgends etwas brauchbares finden, befürchte aber das das wie bei den Intel Atom "kein echter Arm Prozessor ist"?
Die dort laufende Android-Version ist 4.2.1

Ciao
Stefan

Olli73 26. Apr 2017 11:34

AW: Android-Version herausfinden?
 
Zitat:

Zitat von sko1 (Beitrag 1369138)
Ich konnte nirgends etwas brauchbares finden, befürchte aber das das wie bei den Intel Atom "kein echter Arm Prozessor ist"?

Tegra 3 hat eine "ARM Cortex-A9 MPCore CPU" mit NEON support (beim Tegra 2 fehlt NEON noch)

https://en.wikipedia.org/wiki/Tegra#Tegra_3

himitsu 26. Apr 2017 11:35

AW: Android-Version herausfinden?
 
Zitat:

Zitat von sko1 (Beitrag 1369138)
befürchte aber das das wie bei den Intel Atom "kein echter Arm Prozessor ist"?

Ja, es gibt die Pads mit Intels drin, bis hin zu 'nem i7.

Aber Tegra 3 bassiert auch auf 'nem ARM.
Wie heißt es so schön "mit Snapdragon vergleichbar", aber was heißt hier vergleichbar?
(Intel und AMD sind ja auch vergleichbar, bei den x86-Plattformen, aber eben nicht identisch, in allen Befehlen)

sko1 26. Apr 2017 14:11

AW: Android-Version herausfinden?
 
Da werde ich zukünftig noch etliche Probleme erwarten dürfen :-(

Ich bin in sofern "Hardware Noob", welche Prozessoren sind denn nun wirklich mit "RAD Studio Adroid Apps" kompatibel, auf was muss man achten?

Ciao
Stefan

bra 8. Mai 2017 14:34

AW: Android-Version herausfinden?
 
Zitat:

Zitat von sko1 (Beitrag 1368378)
Zitat:

dass ich /proc/cpuinfo abfrage
hast Du da bitte mal einen Codeschnipsel?

Hier mal unser Code:

Delphi-Quellcode:
function GetProcCPUInfo: String;
{$IF Defined(ANDROID)}
var
  FS: TFileStream;
  ch: Char;
begin
  result := '';
  if FileExists('/proc/cpuinfo') then
  begin
    try
      ch := #0;
      FS:= TFileStream.Create('/proc/cpuinfo', fmOpenRead);
      while (FS.Read(ch, 1) = 1) do
        result := result + ch
    finally
      FS.Free;
    end;
  end;
end;
{$ELSE}
begin
  result := 'Nicht implementiert';
end;
{$ENDIF}

function IsHoudiniEmulation: Boolean;
begin
  result := false;
{$IF Defined(ANDROID)}
  if GetProcCPUInfo.Contains('placeholder') then
    result := true;
{$ENDIF}
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz