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
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
Hallo
doch geht ( bei mir seit fast 10 Jahren so ) - alle Android-Versionen
in etwa so:
https://stackoverflow.com/questions/4967669/android-install-apk-programmatically
Das ist genau die Antwort die ich mir erhofft habe. Ich bin dir sooooo dankbar. Vielen vielen Danke!!!!! 😁 😉 👍
[Hinweis] Wie poste ich richtig?
Keine Full Quotes.
- 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
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. 😉
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);
}
}
Du sagst das verwendest Du so seit API 4 im Code steht aber ein API Required 9 Kommentar drin 🤔
...sure?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 ...
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/
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^^
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 😄
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?
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
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
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
Nun habe ich die Lösung. Das hier funktioniert für den Download:
webClient.DownloadFile(newUri, Path.Combine(Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, 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?
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
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[])