Laden...

Kann ich eine App aktualisieren ohne App Store?

Erstellt von Olii vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.681 Views
O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren
Kann ich eine App aktualisieren ohne App Store?

Hallo Leute,

ich hoffe ich bin hier richtig. Ich bin relativ neu was das ganze mit APP's etc angeht. Ich habe eine Frage: Wie kann ich meine APP auf einem Smartphone aktualisieren lassen ohne das es den APP Store dafür braucht?

Kurze Erklärung:
Ich habe eine kleine APP entwickelt (nichts grosses). Diese befindet sich nun auf meinem Handy. Nun möchte ich diese APP quasi von Zeit zu Zeit aktualisieren, allerdings nicht durch den APP Store und auch nicht so das ich es wieder an meinen Computer anschließe. Ich möchte das ganze gerne als Übung machen um mich besser in das alles rein versetzen zu können. Ich weiß das ich mein "Update" auf einen Webspace z.B. hochladen muss, aber wie geht es weiter?

Ich google mich schon tagelang in den Wahnsinn hier.

Kann mir jemand helfen egal in welcher Form? Eine einfache Erklärung? Stichwörter die mir bei meiner suche helfen? Einen Video oder etwas der gleichen?

Ich bin mittlerweile total ratlos.... Eine App konnte ich entwickeln aber ich bin zu dumm um das hier hinzubekommen..

Ich hoffe auf Hilfe :3

H
523 Beiträge seit 2008
vor 6 Jahren

Bei Android würde ich einfach die APK-Datei auf mein Android-Gerät transferieren (z. B. mittels meiner DropBox) und die APK-Datei dann installieren.

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Bei Android würde ich einfach die APK-Datei auf mein Android-Gerät transferieren (z. B. mittels meiner DropBox) und die APK-Datei dann installieren.

Das muss ich ja dann aber manuell machen.
Kann man das auch etwas automatisieren. Ich würde das nämlich auch gerne so einbauen das er z.B. einmal in der Woche nach einem Update guckt oder ich meiner APP quasi vermittle das es ein neues Update gibt.

16.806 Beiträge seit 2008
vor 6 Jahren

So ein Mechanismus öffnet Tür und Tor für Apps mit Malware.
Daher unterstützt das in dieser Form kein einziges mobiles OS von Haus aus.

HockeyApp aka Visual Studio App Center und auch Firebase können das in Form von bewussten Testphasen für Apps.
Ansonsten gibt es allerhand von Erweiterungen, die mit gerooteten Geräten funktioniert - ich hier aber bewusst nicht namentlich nennen will.

T
2.219 Beiträge seit 2008
vor 6 Jahren

Wie Abt schon schreibt, ist dies auf einfachen Weg nicht machbar.
Dies ist auch nicht erwünscht unter mobilen Systemen ala Android/iOS.
Hier dienen die App Stores als zentrale verteiler der Software.
Teilweise werden auch bei Android schon System Apps über den App Store verteilt.

Dein Vorhaben wiederspricht also schon der Architektur von mobilen OS, die ja gerade über den App Store ihre Apps verteilen.
Wie man dein Vorhaben ohne Probleme umsetzt, kann ich dir leider nicht sagen.
Ich vermute aber mal, dass es ohne entsprechende Tools nicht möglich ist.
Diese werden dann aber, wie Abt schon andeutet, ein gerootetes System brauchen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

R
74 Beiträge seit 2006
vor 6 Jahren

Hallo

doch geht ( bei mir seit fast 10 Jahren so ) - alle Android-Versionen

  • deine App verbindet sich mit deinem Server
  • fragt nach einer neuen Version
  • startet den Download
  • installiert die APK per Installer

in etwa so:
https://stackoverflow.com/questions/4967669/android-install-apk-programmatically

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Das ist genau die Antwort die ich mir erhofft habe. Ich bin dir sooooo dankbar. Vielen vielen Danke!!!!! 😁 😉 👍

Hinweis von Abt vor 6 Jahren

[Hinweis] Wie poste ich richtig?
Keine Full Quotes.

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren
  • installiert die APK per Installer

ich hab mich grad in den von dir verlinkten Thread rein gelesen. In manchen der Kommentare wurde gefragt ob ein externes Speichermedium benötigt wird damit dies funktioniert. Hast du auch z.B. eine Speicherkarte oder etwas dergleichen verwendet oder geht das auch ohne? ich hätte nämlich nicht die Möglichkeit eine einzusetzen. Oder müsste vorübergehend ein anderes Smartphone benutzen.

Freue mich jetzt schon auf deine Antwort :3

1.040 Beiträge seit 2007
vor 6 Jahren

Die Fragen treten deshalb auf, weil im Code im verlinkten Artikel Environment.getExternalStorageDirectory zum Download genutzt wird. Natürlich wird dann ein externes Speichermedium benötigt.

Allerdings sollte es kein Problem darstellen, an der Stelle den internen Speicher zu nutzen. 😉

R
74 Beiträge seit 2006
vor 6 Jahren

ja genau.

also Ordner kannst Du einfach "update" definieren - dann ist das in der root deiner App.

"apkFile" für den Download also "update/app.apk" z.B.

Ich hab nochmal nachgesehen bei mir. Is bissel chaotisch - aber der Installer
muss natürlich die *.APK auch lesen können, was nur der Fall ist, wenn die
Rechte auf der Datei entsprechend gesetzt sind.

Verwende ich so unverändert seit Android 1.6 (API 4)


	public static void install(Context context, File apkFile) {
		if (apkFile.exists()) {
			int currentapiVersion = android.os.Build.VERSION.SDK_INT;
			if (currentapiVersion >= android.os.Build.VERSION_CODES.GINGERBREAD){				
				apkFile.setReadable(true, false); // minimum API-Level 9 !
			}else{
				try {
					Runtime.getRuntime().exec("chmod 777 " + apkFile.getPath());
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
			
			Intent intent = new Intent();
			intent.setAction(android.content.Intent.ACTION_VIEW);				
			//intent.setDataAndType(Uri.parse("file://" + apkFile.getPath()), "application/vnd.android.package-archive");
			intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");			
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(intent);
		}
	}

16.806 Beiträge seit 2008
vor 6 Jahren

Du sagst das verwendest Du so seit API 4 im Code steht aber ein API Required 9 Kommentar drin 🤔
...sure?

R
74 Beiträge seit 2006
vor 6 Jahren

Hallo Abt,

ja richtig.

API 9 und größer
apkFile.setReadable(true, false); // minimum API-Level 9 !

API 8 und kleiner
Runtime.getRuntime().exec("chmod 777 " + apkFile.getPath());

Edit: achso g... ähm, ja - fast unverändert. Die letzte Änderung knapp 10 Jahren ...

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Klasse, was für Tolle Antworten. Das hat alles übertroffen was ich mir hätte wünschen können :3.

Ich habe jetzt aber noch eine klize kleine Frage und zwar: damit ich eine Anfrage von meinem Client an meinen Server schicken kann brauche ich ja erstmal einen. Ich wollte mir jetzt test weise einfach ein bisschen kostenlosen Webspace bei z.B. Bplaced.net holen. Das müsste ja reichen für erste Tests. Jetzt kommt aber meine Frage: muss ich ein PHP Skript erstellen das quasi die Anfrage von meinem Client entgegen nimmt und bearbeitet?

Ich habe auf einer Seite die sich developer-blog nennt ein Beispiel gefunden. Dort wird allerdings etwas aus einer mySQL Datenbank geholt. Das brauche ich natürlich nicht. Was ich aber an dem Beispiel nicht verstehe ist wie dieses Skript auf die Anfrage des Clients reagiert. Also ich meine woher weiß das Skript z.B. das es gerade angesprochen wird?

Hier einmal das Beispiel:


<?php
    mysql_connect("localhost","USERNAME","PASSWORD");
    mysql_select_db("DATABASE");
    $sql=mysql_query("SELECT * FROM TABLENAME");
    while($row=mysql_fetch_assoc($sql))
        $output[]=$row;
    print(json_encode($output));
    mysql_close();
?>

So wie ich es nun auch verstanden habe gibt das print im json Format quasi zurück. Aber ich kenne print nur im Zusammenhang etwas in der console oder auf einer Oberfläche zurückzugeben. Sowas wie print("Hello world"). Wie funktioniert das denn das er mit einem einfachen print jetzt die Daten an den Client schickt. Das ist für mich sehr mysteriös 🤔 . Ich bitte darum nicht zu hart zu mir zu sein ._. ich mache das ganze zum ersten mal und gebe mir echt mühe. Ich sitze seit 3 Tagen hier (Krank geschrieben) und versuche das alles zu verstehen und hin zu bekommen.

Hier ist noch der Link auf die Website mit dem Beispiel falls es wen interessiert:
https://developer-blog.net/android-client-php-server-kommunikation/

R
74 Beiträge seit 2006
vor 6 Jahren
  • Webspace kostenlos.org besorgen

  • Ftp-Client einloggen

  • dann bist Du sicher in der Root

  • deine app.apk dahin kopieren ( nix neuer Ordner, nix script, nix Datenbank )

  • Download-Adresse http://kostenlos.org/app.apk

  • Android: "HttpClient" googlen - findest schon^^

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Also das Downloaden habe ich jetzt so versucht:


WebClient webClient = new WebClient();
webClient.DownloadFile("http://meinwebspace.bplaced.net/AppDownload.apk", Path.Combine(Android.OS.Environment.DirectoryDownloads, "/AppDownload.apk"));

leider bekomme ich immer nur eine Meldung das es einen Fehler gab. Ich suche gerade noch nach anderen Wegen aber wenn jemand eine Idee hat, gerne her damit 😄

1.040 Beiträge seit 2007
vor 6 Jahren

Was für einen Fehler gab es?

Beim Path.Combine musst du beim zweiten Teil auf jeden Fall das "/" weglassen.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Das ist die Meldung die kommt:
Unhandled Exception:

System.Net.WebException: An exception occurred during a WebClient request.

Ich suche gerade woran es liegen kann aber noch nichts gefunden. Das / war nur zum testen weil davor auch schon ein Fehler war. Der gleiche.

Edit: muss ich vielleicht alles in das App-Verzeichnis speichern? dazu müsste man das Gerät vorher aber rooten soweit ich weiß. Wobei ich grad so überlege und das ja kein Sinn macht. Manuell kann ich die Datei ja downloaden und in jeden Ordner packen den ich möchte. Es muss wohl an was anderem liegen

5.657 Beiträge seit 2006
vor 6 Jahren

Hi Olii,

schau in die InnerException und in die Doku. Und lies mal den Artikel, den dir p!lle verlinkt hat.

Weeks of programming can save you hours of planning

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Ahhh okey ich wusste nicht das es sowas wie eine inner exeption gibt 🤔 und wieder was neues gelernt. Danke 😁

Damit habe ich nun die Ursache: Er hat ein Problem mit dem Pfad.
Das sagt mir die inner exeption:
ystem.IO.DirectoryNotFoundException: Could not find a part of the path "/Download/AppDownload.apk".01-06 19:07:35.161 I/mono-stdout(25755): System.IO.DirectoryNotFoundException: Could not find a part of the path "/Download/AppDownload.apk".

Also werde ich mal gucken wie ich das noch so hinbekommen kann. Wundert mich das er den Pfad nicht findet und ein "/" vor Download setzt. Beim debugen hab ich grad auch in den Pfad geguckt da war es zumindest nich drin. seltsam

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 6 Jahren

Nun habe ich die Lösung. Das hier funktioniert für den Download:


webClient.DownloadFile(newUri, Path.Combine(Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads), "AppDownload.apk"));

Es ist theoretisch der gleiche Pfad nur anders gecoded. Ich weiß nich wieso es so angenommen wird aber es funktioniert so bei mir 😄.

Jetzt habe ich aber Probleme mit dem installieren... Red Baron war ja so freundlich und hat sogar seinen Code ausgestellt aber dazu habe ich eine Frage: Welche usings benutzt du oder welche müssen benutzt werden? Denn z.B. das hier: Uri.fromFile funktioniert so nicht da mir gesagt wird Uri enthält keine Definition dafür. und ähnliches beim Intent: FLAG_ACTIVITY_NEW_TASK keine Definition hierfür.

Weiß da jemand bescheid?

5.657 Beiträge seit 2006
vor 6 Jahren

Hast du mal in die Doku geschaut? Dadurch sollten sich solche Fragen eigentlich relativ schnell beantworten.

[Hinweis] Bitte schau in die SDK-/MSDN-Doku
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Weeks of programming can save you hours of planning

1.040 Beiträge seit 2007
vor 6 Jahren

Der Code von RED-BARON sieht starkt nach Java (Android Studio) aus. Das erkennt man z.B. an den kleingeschriebenen Methoden.
Wenn du mit Visual Studio und Xamarin entwickelst, reicht es i.d.R. die Methoden groß zu schreiben. Auch heißen einige Klasse anders, wie z.B. die Flags-Klasse beim Intent. Da sollte IntelliSense aber helfen.

  
Path.Combine(Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads), "AppDownload.apk");  

Du kannst beim Path.Combine() übrigens mehrere Teilstücke angeben, ein verschachteln ist nicht notwendig:

Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads, "AppDownload.apk");

Path.Combine Method (String,String,String)
Path.Combine Method (String,String,String,String)
Path.Combine Method (String[])