Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android andere App mit Aufrufschalter starten (https://www.delphipraxis.net/192374-android-andere-app-mit-aufrufschalter-starten.html)

sko1 13. Apr 2017 06:31

Android andere App mit Aufrufschalter starten
 
Hallo,

ich habe 2 Android-Apps entwickelt.
Nun möchte ich aus der ersten App die zweite (wenn vorhanden) mit "Aufrufschalter" starten, so wie man das in Windows kennt:

"xyz.exe /aufrufschalter"

Für Android fehlt mir da irgendwie komplett der Ansatz, wie man das bewerkstelligen könnte.
Hat jemand da eine Idee dazu?

Ciao
Stefan

Rollo62 13. Apr 2017 06:43

AW: Android andere App mit Aufrufschalter starten
 
Hilft dir das und das weiter ?
Vielleicht in Kombination mit Push-Notifications.

Ich denke es geht nur so das ein Backgroundservice sich darum kümmert und womöglich Notifications and die gewünschten Apps schicken kann.
Die Apps selber sind in einer Sandbox, so wie ich das sehe kommen die da nicht so einfach raus.

Rollo

sko1 13. Apr 2017 06:53

AW: Android andere App mit Aufrufschalter starten
 
Hallo,

sieht beides auf den ersten Blick nicht ganz so aus wie ich benötige...

Aber mir kommt da eine Idee (meist so, wenn man erst mal die Frage geschrieben hat dann auf Antwort hofft...) :

Programm 2 benutzt eine Datenbank, die öffentlich unter /Documents/... liegt.
1) Hier könnte App1 ja einen speziellen Eintrag schreiben
2) App1 startet Intent mit App2
3) App2 sucht beim Starten diesen Eintrag, benutzt ihn als Startparameter und löscht ihn

Wäre das denkbar?

Ciao
Stefan

mjustin 13. Apr 2017 07:32

AW: Android andere App mit Aufrufschalter starten
 
Umwege über Background-Services und Datenbanken braucht man nicht, man kann aus einer Android App eine andere über Intent mit Extra-Argumenten starten.

Beschrieben wird das z.B. hier:

http://stackoverflow.com/questions/2...ing-parameters

App 1:

Code:
@Override
    public void onClick(View v) {

        Intent sendIntent =  getPackageManager().getLaunchIntentForPackage("com.example.app2");
        sendIntent.putExtra("my_text", "This is my text to send.");
        startActivity(sendIntent);

    }
App 2:


Code:
EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    text=(EditText)findViewById(R.id.edittext1);// This was missing in your code.
    Intent intent = getIntent();

if (intent.hasExtra("my_text")) {
        String sharedText = intent.getStringExtra("my_text");
        text.setText(sharedText);
}
}

sko1 13. Apr 2017 07:34

AW: Android andere App mit Aufrufschalter starten
 
Genial!

Danke, danke, danke! :-D

Ciao
Stefan

Nachtrag:
Das sah ja auf den ersten Blick sehr gut aus, ich habe jedoch keine Ahnung wie das in Delphi umzusetzen ist :-(

Rollo62 13. Apr 2017 09:21

AW: Android andere App mit Aufrufschalter starten
 
Startet das so direkt, ohne das der User noch eine Bestätigungs-Taste drücken muss ?
Das wäre wirklich super.

Rollo

sko1 13. Apr 2017 11:52

AW: Android andere App mit Aufrufschalter starten
 
Das Starten direkt ohne zusätzliche Benutzereingabe funktioniert:

Delphi-Quellcode:
procedure StartAPP();
{$IFDEF ANDROID}
var
  Intent: JIntent;
{$ENDIF}
begin
{$IFDEF ANDROID}
  try
    // Direkt gewünschtes Programm starten
    Intent := TJIntent.Create;
    Intent := TAndroidHelper.Activity.getPackageManager.
      getLaunchIntentForPackage
      (StringToJString('com.embarcadero.xxxxxxxxx'));
    TAndroidHelper.Activity.startActivity(Intent);
    exit;
  except
    showmessage('Programm nicht gefunden !');
    exit;
  end;
{$ENDIF}
  showmessage('Diese Funktionalität ist in Windows nicht verfügbar !');
end;

Ciao
Stefan

Rollo62 13. Apr 2017 14:07

AW: Android andere App mit Aufrufschalter starten
 
Toll, muss ich über Ostern mal ausprobieren :-D

sko1 9. Mär 2018 08:48

AW: Android andere App mit Aufrufschalter starten
 
Ich hole den Thread mal wieder aus der Versenkung ;-)

Das starten der zweiten App mit Übergabe einer Info funktioniert in soweit, dass die App wie gewünscht gestartet wird und der Compiler bei folgendem Code der ersten App nicht meckert:

Delphi-Quellcode:
procedure StartAuftrag(Auftragsnummer: string);
var
  Intent: JIntent;
begin
  try
    Intent := TJIntent.Create;
    Intent := TAndroidHelper.Activity.getPackageManager.
      getLaunchIntentForPackage(StringToJString('com.embarcadero.xxxxx'));
    Intent.putExtra(StringToJString('Auftragsnummer'),
      StringToJString(Auftragsnummer));
    TAndroidHelper.Activity.startActivity(Intent);
    exit;
  except
    showmessage('Programm nicht gefunden !');
  end;
end;
aber mir fehlt der Ansatz, wie ich nun die übergebene Auftragsnummer in der zweiten App bekomme!
Den c-Code

Delphi-Quellcode:
EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    text=(EditText)findViewById(R.id.edittext1);// This was missing in your code.
    Intent intent = getIntent();

if (intent.hasExtra("my_text")) {
        String sharedText = intent.getStringExtra("my_text");
        text.setText(sharedText);
}
}
bekomme ich nicht für meine in Delphi geschriebene App umgesetzt.

Und wenn das dann funktionieren würde:
Muss die zweite App geschlossen und mit Parameter wieder gestartet werden oder bekommt sie "intern" eine Message mit der Nummer?

Ciao
Stefan

sko1 9. Mär 2018 13:27

AW: Android andere App mit Aufrufschalter starten
 
Nach stundenlangem Googlen bin ich auf eine Demo

http://docwiki.embarcadero.com/CodeE...Intents_Sample

gestoßen, welche eigentlich das macht, was ich mir wünsche:

- andere App starten und der einen Parameter mitgeben.
- die andere App startet und benutzt den Parameter

Leider hat das Ganze einen Schönheitsfehler, der das Ganze unbrauchbar macht:

Der Parameter beim Start wird nur ausgewertet wenn die zweite App neu gestartet wird!
Ist sie schon gestartet und wird durch den Intend nur wieder hervorgeholt nützt der übergebene Parameter nichts!

Es wäre toll wenn jemand eine funktionierende Lösung der Problematik hätte!

Ciao
Stefan

mjustin 9. Mär 2018 15:55

AW: Android andere App mit Aufrufschalter starten
 
Die Demo-App "ReceiveIntent" verwendet laut Manifest nicht den Standard-Launchmode sondern den Launchmode "singleTask":

Code:
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden"
                android:launchMode="singleTask">
Wie hier beschrieben wird, ist in diesem Launchmodus der Intent nicht auf die normale Weise an die App übergeben. Der Intent wird (unter Java) durch die Methode onNewIntent() übergeben.

Allerdings habe ich weder das passende Delphi noch sonstige Informationen wie man den Receive Code ändern muss, damit der Intent der von Android an onNewIntent() gesendet wird unter FireMonkey erhalten kann. Möglicherweise geht das auch über AppEventService.SetApplicationEventHandler(HandleA ppEvent);

sko1 12. Mär 2018 06:14

AW: Android andere App mit Aufrufschalter starten
 
Zitat:

Allerdings habe ich weder das passende Delphi noch sonstige Informationen wie man den Receive Code ändern muss, damit der Intent der von Android an onNewIntent() gesendet wird unter FireMonkey erhalten kann.
Danke für den Denkanstoß!
Ich muss nicht auf der Empfängerseite ansetzen sondern beim Sender:

Delphi-Quellcode:
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
Damit kommt auch bei laufendem Empfängerprogramm jetzt der neue aktuelle Inhalt an!

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

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