# Apk automatisch installieren per Button



## wer112 (11. Aug 2021)

Ich möchte, dass eine Apk vom Internet heruntergeladen wird und im hintergrund ohne extra neue Zustimmung installiert wird. Schließlich drückt der Nutzer ja extra auf Installieren. Der Download funktioniert sehr gut. Aber das Installieren funktioniert garnicht oder es stürtzt ab. Ich habe mehrere Sachen ausprobiert, selbst eine einfache Installation, wo der Nutzer extra Zustimmen muss, geht nicht(Also wenn man eine Apk runterlädt und auf die Datei klickt, dann öffnet sich ja ein Fenster, ob man die App/Update installieren möchte oder nicht).

Ich habe gelernt, dass die Hardware nur 0 und 1 versteht. Über die Hardware liegt Assembler. Assembler hat keine Regeln und keine Gesetze. Assembler kann und darf alles machen. Über Assembler liegt das Betriebsystem, was im Kern Assembler hat und der Rest eine Hochsprache ist(C, C++,..). Das Betriebsystem hat Regeln und gesetze festgelgt und alle müssen sich daran halten. 

Android ist ja Open Source! Das darf jeder einsehen und ja verändern...* Aber der Play Store kann ja auch Apps im Hintergrund installieren, obwohl er selber auf dem Betriebsystem läuft und sich an dessen Regeln halten muss! *Also Ansicht ist es ja möglich, aber nicht zu einfach.

Wie kann ich eine Runtergeladene Datei im Hintergrund installiert bekommen?
Wiso kann ich es nicht mit dem Android Fester installieren, wo der Nutzer es noch mal Zustimmen muss?

Jede Hilfe ist sehr willkommen! 


Das sind meine ganzen Installationen versuche:


```
private void DownloadApk() {

        String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
        String fileName = "cwa.apk";
        destination += fileName;
        final Uri uri = Uri.parse("file://" + destination);



        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apk_url));
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
        request.setTitle("Download " + app_name);
        request.setDescription("");
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "cwa.apk");

        DownloadManager manager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);



        final long downloadId = manager.enqueue(request);


        BroadcastReceiver onComplete = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                install.setDataAndType(uri, manager.getMimeTypeForDownloadedFile(downloadId));
                startActivity(install);

                getActivity().unregisterReceiver(this);
                getActivity().finish();
            }
        };

        getActivity().registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));




        InstallApk();


    }
    */
```



```
private void InstallApk() {










        /*

        String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";
        String fileName = "cwa.apk";
        destination += fileName;
        final Uri uri = Uri.parse("file://" + destination);


        BroadcastReceiver onComplete = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Intent install = new Intent(Intent.ACTION_VIEW);
                install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                install.setDataAndType(uri);
                startActivity(install);

                getActivity().unregisterReceiver(this);
                getActivity().finish();
            }
        };

        getActivity().registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));


         */


        /*

        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.fromFile(new File(Environment.DIRECTORY_DOWNLOADS + "/cwa.apk")), "application/vnd.android.package-archive");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);

         */

        /*
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.fromFile(new File(Environment.DIRECTORY_DOWNLOADS + "cwa.apk")), "application/vnd.android.package-archive");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);

         */

/*
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "cwa.apk")), "application/vnd.android.package-archive");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);

 */

        /*
        Intent i = new Intent(Intent.ACTION_INSTALL_PACKAGE);
        File file = new File(Environment.DIRECTORY_DOWNLOADS + "/cwa.apk");
        i.setData(Uri.fromFile(file));
        startActivity(i);
*/

        /*

        Intent i = new Intent(Intent.ACTION_INSTALL_PACKAGE);
        File file = new File(Environment.DIRECTORY_DOWNLOADS + "/cwa.apk");
        i.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        startActivity(i);

         */


/*

        Intent i = new Intent(Intent.ACTION_VIEW);
        File file = new File(Environment.DIRECTORY_DOWNLOADS + "/cwa.apk");
        i.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        startActivity(i);
*/



/*

        Intent i = new Intent(Intent.ACTION_INSTALL_PACKAGE);
        i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        i.setDataAndType(Uri.fromFile(new File(Environment.DIRECTORY_DOWNLOADS + "cwa.apk")), "application/vnd.android.package-archive");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

*/

    }
```


Wer könnte mir helfen, damit man erstmal normal installiert und später auch ohne extra neue Zustimmung installieren kann(Der Nutzer gibt ja die Zustimmung, weil er ja schon auf den Installieren Button gedrückt hat! )


----------



## Jw456 (11. Aug 2021)

Um eine APK zu Installieren  brauchst du den PacketManager .

Aber seit Android 11 oder war es schon 10  ist es nicht mehr möglich eine App im Hindergrund  zu Installieren


----------



## wer112 (11. Aug 2021)

Jw456 hat gesagt.:


> Um eine APK zu Installieren  brauchst du den PacketManager .


Und wie macht man das? Ich habe eigentlich nur sowas gefunden...


Jw456 hat gesagt.:


> Aber seit Android 11 oder war es schon 10  ist es nicht mehr möglich eine App im Hindergrund  zu Installieren


1.
Wie mache ich das unter API 30? Ich habe es auf API 29 getestet. Also müsste es ja funktionieren, laut dir... 

2. Wenn es Ab API 30 Nicht mehr funktionier, wie kann ich das Android Fenster zum Installieren aufrufen(Wenn man auf eine APK Datei drückt öffnet sich ja ein Android Fester für die Installation.


----------



## Jw456 (11. Aug 2021)

__
		https://www.reddit.com/r/androiddev/comments/2wf6ne


----------



## Jw456 (11. Aug 2021)

Download and Install APK Programmatically
					

Hello guys, as per title in this post I 'll tell you how to download the app using a download manager and install it programmatically. For doing that will




					androidwave.com
				




ok es ist Kotlin solte aber verstanden werden


----------



## M.L. (11. Aug 2021)

wer112 hat gesagt.:


> Hardware nur 0 und 1 versteht.


Etwas genauer: die Hardware "reagiert" auf Befehle Strom durch irgendwelches Material fliessen zu lassen. Die 0 und 1 dienen der mathematischen Modellierung des Geschehens.
Was ist die Minimal-Android-Version die die Installation und den Betrieb ermöglichen ?  Weiterhin könnte man auch zum Thema hybride oder Web-Applikation recherchieren.


----------



## wer112 (11. Aug 2021)

M.L. hat gesagt.:


> Etwas genauer: die Hardware "reagiert" auf Befehle Strom durch irgendwelches Material fliessen zu lassen. Die 0 und 1 dienen der mathematischen Modellierung des Geschehens.
> Was ist die Minimal-Android-Version die die Installation und den Betrieb ermöglichen ?  Weiterhin könnte man auch zum Thema hybride oder Web-Applikation recherchieren.


Aber ansicht ist der Aufbau ja Richtig: Hardware -> Assembler -> Betriebsystem -> Apk
Und alle müssen sich ja an die Gesetze(Regeln) vom Betriebsystem halten auch der Play Sore.

Oder wie macht er das sonst?


----------



## LimDul (11. Aug 2021)

wer112 hat gesagt.:


> Aber ansicht ist der Aufbau ja Richtig: Hardware -> Assembler -> Betriebsystem -> Apk
> Und alle müssen sich ja an die Gesetze(Regeln) vom Betriebsystem halten auch der Play Sore.
> 
> Oder wie macht er das sonst?


Hardware, assembler spielen hier mal überhaupt keine Rolle. 
Das Android OS was drauf läuft hat klare Vorgaben, was die Installation von APKs angeht. Und eine ist, dass die eben nicht automatisch installiert werden dürfen. Es gibt einzelne Anwendungen, die vom Betriebssystem berechtigt sind (wie der Play Store) mit weniger Hürden auszukommen.


----------



## wer112 (11. Aug 2021)

LimDul hat gesagt.:


> Hardware, assembler spielen hier mal überhaupt keine Rolle.
> Das Android OS was drauf läuft hat klare Vorgaben, was die Installation von APKs angeht. Und eine ist, dass die eben nicht automatisch installiert werden dürfen. Es gibt einzelne Anwendungen, die vom Betriebssystem berechtigt sind (wie der Play Store) mit weniger Hürden auszukommen.


Wie kann man das machen, damit man auch berechtigt ist? Wie hat der Play Store das hinbekommen?

Aber das normale öffnen ist ja möglich, das sehe ich ja beim Amazon Store, F-Droid, das nach dem Download es "geöffnet" ist.


----------



## Jw456 (11. Aug 2021)

Dann hat der store die Berechtigung von Google bekommen. Die müsstest du auch beantragen und bezahlen.


----------



## LimDul (11. Aug 2021)

wer112 hat gesagt.:


> Wie kann man das machen, damit man auch berechtigt ist? Wie hat der Play Store das hinbekommen?
> 
> Aber das normale öffnen ist ja möglich, das sehe ich ja beim Amazon Store, F-Droid, das nach dem Download es "geöffnet" ist.


Dann muss der User "deinem Store" die Berechtigung erteilen, dass der das darf. 

Siehe hier:








						FAQ - F-Droid-App | F-Droid - Free and Open Source Android App Repository
					

Der Client zeigt eine neuere Version an. Warum meldete er mir kein Update?  Wozu braucht F-Droid diese Berechtigungen?  Was ist der Expertenmodus?  Ich kan...




					f-droid.org
				






> Die F-Droid-Rechteerweiterung nutzen, die F-Droid System-<code>-App-Privilegien verschafft, was die Sicherheit erhöht, da sowohl automatische App-Updates als auch das Ausschalten der „Unbekannten Herkunft“ in den Einstellungen möglich werden:
> 
> org.fdroid.fdroid.privileged.USE_SERVICE
> 
> ...



Soll heißen, so einfach geht das nicht. Ohne Root Zugriff kann man Dritt-Stores nicht so einfach installieren. Anders sieht es mit den Stores (Wie den Samsung oder Amazon Store) aus, wenn direkt vom Handy-Hersteller als Teil des OS mit installiert werden.


----------



## LimDul (11. Aug 2021)

Um es vielleicht noch mal ganz klar zu sagen:

Eine App die nicht aus dem Google Play Store oder einem anderen, bereits vom Hersteller mitgelieferten Store kommt, kann nur installiert werden wenn:
* Die Installation von Apps aus unbekannten Quellen erlaubt ist (Generell oder für diese konkrete Installation)
* Der Benutzer dieser Installation explizit zustimmt

Das ist eines der Sicherheitsmodelle von Android - um das auszuhebeln, braucht man Root Zugriff auf dem entsprechenden Gerät, dann kann man das deaktivieren.


----------



## wer112 (11. Aug 2021)

LimDul hat gesagt.:


> Um es vielleicht noch mal ganz klar zu sagen:
> 
> Eine App die nicht aus dem Google Play Store oder einem anderen, bereits vom Hersteller mitgelieferten Store kommt, kann nur installiert werden wenn:
> * Die Installation von Apps aus unbekannten Quellen erlaubt ist (Generell oder für diese konkrete Installation)


Ich habe für die App aus unbeknnte Quellen erlaubt


LimDul hat gesagt.:


> * Der Benutzer dieser Installation explizit zustimmt


Wie mache ich das? Es geht noch nicht das Android Fester auf, was immer kommt wenn man auf eine Apk Datei drückt....




LimDul hat gesagt.:


> Das ist eines der Sicherheitsmodelle von Android - um das auszuhebeln, braucht man Root Zugriff auf dem entsprechenden Gerät, dann kann man das deaktivieren.


Und wenn das Gerät gerootet ist, wie heble ich dies aus?


----------



## Jw456 (11. Aug 2021)

Ich hatte dir ja schon einen Link gegeben hier noch etwas in Java .
Ohne dass der User zustimmt geht es nicht.









						Download And Install App Programmatically - Weps Tech
					

Here I am going to give you answer of your question How to download and install app programmatically in android and also add run time permission in android.



					www.wepstech.com


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> Ich hatte dir ja schon einen Link gegeben hier noch etwas in Java .
> Ohne dass der User zustimmt geht es nicht.
> 
> 
> ...


Vielen Dank für den Link! Das ist der einzige Code, der perfekt funtioniert hat.

Ich hätte ein größeres Problem. Es geht um die Sicherheit der Nutzer. Ich muss ja die Apk ständig löschen, damit man keine App kauft und dann hat man die Apk und stellt es woanders rein...

Ich bräuchte mehrere Lösch Vorgänge, damit man nicht "Tricksen" kann und die Apk behält.

- Wie mache ich das, wenn man nur aus der App rausgeht, dass es gelöscht wird?
- Wie mache ich das, wenn jemand das Handy ausschaltet, ohne das er aus der App rausgeht, dass es gelöscht wird?
- Wie mache ich das, wenn jemand die Installation Abbricht, das es gelöscht wird?
- Wie komme ich zu der Datei? Schließlich legt die App ja den Pfad fest.(Interner Speicher/Android/data/...../files/...apk), aber man weiß ja nicht, ob das immer dort ist....


Das wäre aus Sicherheitsgründen ja sehr wichtig.


----------



## Jw456 (13. Aug 2021)

Google macht das ja mit den Zertifikat womit es die APK baut. Das auf deinem Handy überprüft wird . ist mit deinem Google Konto verbunden . 
Wenn die apk auf einen anderen Handy Installiert  wird und das ein anderes Google Konto hat geht es nicht .
So etwas solltest du dir auch überlegen.


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> Google macht das ja mit den Zertifikat womit es die APK baut. Das auf deinem Handy überprüft wird . ist mit deinem Google Konto verbunden .
> Wenn die apk auf einen anderen Handy Installiert  wird und das ein anderes Google Konto hat geht es nicht .
> So etwas solltest du dir auch überlegen.


Was meinst du damit? 

Man kann doch eine runtergeladene Datei ja normal löschen. Auch Editores können das.


----------



## Jw456 (13. Aug 2021)

wer112 hat gesagt.:


> Was meinst du damit?
> 
> Man kann doch eine runtergeladene Datei ja normal löschen. Auch Editores können das.


  Ja das kann  man aber du hast die APK installiert, und wenn du die Download  Datei löschst ist die Apk in der Installation noch vorhanden. Ein geübter Benutzer list  sie einfach wider aus. Gibt  auch Apps die das für dich machen können.


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> Ja das kann  man aber du hast die APK installiert, und wenn du die Download  Datei löschst ist die Apk in der Installation noch vorhanden. Ein geübter Benutzer list  sie einfach wider aus. Gibt  auch Apps die das für dich machen können.


Ja ich hatte auch mal eine App, die eine installierte App wieder zur einer Apk zusammen führen kann. Aber die normelen Benutzer, die sich damit nicht auskennen, nehmen einfach die Apk und geben es weiter. Natürlich kann ich ja nicht dafür sorgen, damit jemand mit einem anderen Weg es trotzdem schafft(mit einer anderen App, z.B.: MyAppSharer. Ich möchte ja, das die Roh Apk gelöscht wird. Und ich denke es gibt dafür auch keine Sicherheitsmaßname um eine einfache Datei löscht.

Deswegen muss ich ja aus meiner Sicht, alles tun, das man die Apk nicht mehr so im Besitz hat.

Wie mache ich das? Wie oben Beschrieben?


----------



## Jw456 (13. Aug 2021)

Du weist doch in wechen ordner  du sie runtergeladen hast. wo ist das Problem die zu löschen?


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> Du weist doch in wechen ordner  du sie runtergeladen hast. wo ist das Problem die zu löschen?


Ja,ich habe die Datei im Ordner Interner Speicher/Android/data/-----/file/---.apk gefunden.
Man kann dann ja normal löschen.
Das ist jetzt bei mir. Ich weiß ja nicht, wo die bei den anderen gespeichert ist. Das ist ja im Code erhalten.
Ich benötige ja Hile, damit das gelöscht wird, wenn man:



wer112 hat gesagt.:


> - Wie mache ich das, wenn man nur aus der App rausgeht, dass es gelöscht wird?
> - Wie mache ich das, wenn jemand das Handy ausschaltet, ohne das er aus der App rausgeht, dass es gelöscht wird?
> - Wie mache ich das, wenn jemand die Installation Abbricht, das es gelöscht wird?
> - Wie komme ich zu der Datei? Schließlich legt die App ja den Pfad fest.(Interner Speicher/Android/data/...../files/...apk), aber man weiß ja nicht, ob das immer dort ist....


----------



## Jw456 (13. Aug 2021)

```
String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
                File file = new File(PATH);
                boolean isCreate = file.mkdirs();
                File outputFile = new File(file, "my_apk.apk");
```

ist der Teil der, der den Pfad  und die Datei erstellt.


also

```
outputFile.delete()
```

nach der Installation

PS beim Isntallieren 
wird die datei auch wider geöffnet 

```
String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
                File file = new File(PATH + "/my_apk.apk");
```

wenn fertig könnte sie gelöscht werden.


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> ```
> String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
> File file = new File(PATH);
> boolean isCreate = file.mkdirs();
> ...


Und der Rest? Also Ich würde eine Methode erstellen, z.B. private void ApkDelete(){} und dann diesen Code.
Dieser Code soll ja ausgeführt werden, wenn der Nutzer irgendwas macht...


----------



## Jw456 (13. Aug 2021)

der code ist aus dem Link den du hast und den du benuten willst.


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> der code ist aus dem Link den du hast und den du benuten willst.


Und wie sieht es ausmit den anderen Fragen?


----------



## Jw456 (13. Aug 2021)

In dem link wird das installieren mit einem  Intent und startActivity(intent); gemacht 

Ich würde di empfehlen  das du  den Intent  mit startActivityForResult aufrufst denn wenn du die Result  Methode Implementierst  bekommt du mit wenn es fertig ist. 





__





						Android StartActivityForResult Example - javatpoint
					

Android StartActivityForResult Example with examples of Activity and Intent, Fragments, Menu, Service, alarm manager, storage, sqlite, xml, json, multimedia, speech, web service, telephony, animation and graphics



					www.javatpoint.com
				





Auf den Speicherort der Datei kann eigentlich nur deine APP in der du gerade bist zugreifen oder du hast root Rechte.

Also musst du die Datei gleich nach  der Installion  löschen.
Deshalb startActivityForResult.


----------



## Jw456 (13. Aug 2021)

>   Wie mache ich das, wenn man nur aus der App rausgeht, dass es gelöscht wird?

Vor dem beenden der app löschen

>   Wie mache ich das, wenn jemand das Handy ausschaltet, ohne das er aus der App rausgeht, dass es gelöscht wird?

dazu kannst du nur mit einem broadcast receiver  Überwachen




__





						Android BroadcastReceiver - Tutorial
					





					www.vogella.com
				





>   Wie mache ich das, wenn jemand die Installation Abbricht, das es gelöscht wird?

bekommst in der onActivityResult Methode mit.


>   Wie komme ich zu der Datei? Schließlich legt die App ja den Pfad fest.(Interner Speicher/Android/data/...../files/...apk), aber man weiß ja nicht, ob das

Denn weist du ja schon .


----------



## Jw456 (13. Aug 2021)

Tipp ich offfe du kennst den Livecycle  einer Activity und somit die onPause() onStop() oder onDestroy()


----------



## wer112 (13. Aug 2021)

Jw456 hat gesagt.:


> Tipp ich offfe du kennst den Livecycle  einer Activity und somit die onPause() onStop() oder onDestroy()


genau das suche ich bzw. das meine ich! Das heißt, wenn ich z.B. onStop methode mache und jemand beendet die App, dann wird diese Methode ausgeführt und somit die Apk gelöscht. Aber funktioniert das auch im Fragment? Ich habe vorhin mal mein Zurückstop versucht, aber es geht nicht. Geht das nur in Activitys oder auch in den Fragmente?

onPause ist, das man aus der App rausgeht, aber nicht komplett schließt?
onStop ist bestimmt, dass man die App komplett schließt?

Was war den onDestroy??

Gibt es auch eine Methode, sowie onStop... für das Herunterfahren??


----------



## Jw456 (13. Aug 2021)

wer112 hat gesagt.:


> Gibt es auch eine Methode, sowie onStop... für das Herunterfahren??


nein









						Programmier Tutorial: Apps für Android entwickeln – Teil 27: Der Lebenszyklus einer Android App (Android Activity Lifecycle)
					

Dabei werden wir erfahren in welchen Zuständen eine Activity in Android existieren und über welche Lifecycle-Methode sie die Zustände wechseln kann. Die verschieden Lifecycle-Methode werden wir anschließend in der MainActivity-Klasse unserer Android App implementieren und…




					www.programmierenlernenhq.de
				




in der methode musst du schon das Löschen selber machen.

PS ein Fragment läuft immer in einer Activity.









						Fragment lifecycle  |  Android Developers
					






					developer.android.com


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> Tipp ich offfe du kennst den Livecycle  einer Activity und somit die onPause() onStop() oder onDestroy()


Ich habe das ausprobiert. Habe da überall einen Toast reingeschrieben, damit ich sehen konnte, was das kann.
Alles außer onDestroy hat funktioniert.
Ich habe dann die Apk Löschcode verlinkt und diese Livecycle Methode hat es problemlos gelöscht.
Das Problem war nun, dass wenn man die Apk downloaded und dann geht das Installierfenster auf, das es ein Fehler beim Parsen besteht. Ist ja auch logisch, da man ja aus der App rausgeht bzw. stopt, das die Apk gelöscht wird. Da kann es ja nicht installieren. Es wurde nur der Toast von onStop angezeigt. onPause und onDetech wurde ja nicht angezeigt. Deswegen hatte ich erst das rauskommentiert und alls das nicht funktioniert hatte, habe ich den Rest Rauskommentiert. Leider hatt somit irgendwie nixs funktioniert. Das einzige, was ich drinnen gelassen hatte, war onStart, was jetzt nicht soviel nützt....


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> In dem link wird das installieren mit einem  Intent und startActivity(intent); gemacht
> 
> Ich würde di empfehlen  das du  den Intent  mit startActivityForResult aufrufst denn wenn du die Result  Methode Implementierst  bekommt du mit wenn es fertig ist.
> 
> ...


Da das mit den Livecyle nicht funktioniert hatte, habe ich irgendwas mit Result gemacht. Natürlich habe ich einen Toast gehabt, um zu sehen, ob es funktioniert. Der Result hat nur funktioniert, wenn man auf Abbrechen oder die Zurück Taste drückt. Sollte ein Result zurückkommen, dann sollte die Apk gelöscht werden. Leider, als ich die Methode zum Löschen der Apk eingebunden hatte, hat es nicht funktioniert, mit dem Installieren. Es gibt irgendwelche Probleme mit dem Parsen.... Aber der Toast funktionierte. Die Lösche Methode funktionierte ja, hatte das ja mit der Livecycle Methode ja gesehen...

Woran kann es liegen?

Der Aktuelle Code:


```
package -.-.-.-.-.-.-.-.-.-.-.-.-.-.-;



import android.Manifest;
import android.app.Activity;
import android.app.DownloadManager;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Objects;


import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;


public class App_Fragment extends Fragment {

    private static final int PERMISSION_REQUEST_CODE = 200;

    Button install_btn;
    
    String app_name = ".....";
    
    Integer euro = 0;
    Integer cent = 00;
    
    String apk_url = "http://...";
    String packageName = "....";
    
    String beschreibungstext;
    
    Integer qc_geprueft = 0;
    
    String app_version = ".....";
    
    Integer vgeprueft = 0;
    
    String berechtigungen[];
    
    String entwickler_name;
    String entwickler_email;
    String entwickler_webseite;
    


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


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View fragmentlayout_app_fragment = inflater.inflate(R.layout.activity_app__fragment, null);

        install_btn = (Button)fragmentlayout_app_fragment.findViewById(R.id.install_button);


        /*
        
        AppDatenImport();
                
         */



        IsAppInstall();


        



        return  fragmentlayout_app_fragment;
    }

    private boolean IsAppInstall() {

        PackageManager  pm = getActivity().getPackageManager();
        try {
            PackageInfo info = pm.getPackageInfo(".........", PackageManager.GET_META_DATA);

            install_btn.setText("Deinstallieren");
            install_btn.setTextColor(Color.parseColor("#000000"));
            install_btn.setBackgroundResource(R.drawable.deinstall_button_style);

            install_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getActivity(), "Wird gelöscht", Toast.LENGTH_SHORT).show();
                }
            });





        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();

            install_btn.setText("Installieren");
            install_btn.setTextColor(Color.parseColor("#e714c8"));
            install_btn.setBackgroundResource(R.drawable.install_button_style);

            install_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (checkPermission()){
                        UpdateApp atualizaApp = new UpdateApp();
                        atualizaApp.setContext(getActivity());
                        atualizaApp.execute(apk_url);

                    }else{
                        requestPermission();
                    }
                }
            });
            return false;
        }

        return true;


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE){
            if (grantResults.length > 0){
                boolean locationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean cameraAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                if (locationAccepted && cameraAccepted){
                    UpdateApp updateApp = new UpdateApp();
                    updateApp.setContext(getActivity());
                    updateApp.execute(apk_url);
                }
            }
        }
    }



    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    private boolean checkPermission(){
        int result = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), WRITE_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), READ_EXTERNAL_STORAGE);

        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    private void  requestPermission(){
        ActivityCompat.requestPermissions(getActivity(), new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }






    public class UpdateApp extends AsyncTask<String, Integer, String>{
        private ProgressDialog mPDialog;
        private  Context mContext;

        void setContext(Activity context){
            mContext = context;
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mPDialog = new ProgressDialog(mContext);
                    mPDialog.setMessage("Bitte warten...");
                    mPDialog.setIndeterminate(true);
                    mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                    mPDialog.setCancelable(false);
                    mPDialog.show();
                }
            });
        }

        @Override
        protected String doInBackground(String... arg0) {

            try {

                URL url = new URL(arg0[0]);
                HttpURLConnection c = (HttpURLConnection) url.openConnection();
                c.setRequestMethod("GET");
                c.setDoOutput(true);
                c.connect();

                int lenghtOfFile = c.getContentLength();

                String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
                File file = new File(PATH);
                boolean isCreate = file.mkdir();
                File outputFile = new File(file, "------.apk");
                if (outputFile.exists()){

                    boolean isDelete = outputFile.delete();

                }
                FileOutputStream fos = new FileOutputStream(outputFile);

                InputStream is = c.getInputStream();

                byte[] buffer = new byte[1024];
                int len1;
                long total = 0;
                while ((len1 = is.read(buffer)) != -1){
                    total += len1;
                    fos.write(buffer, 0, len1);
                    publishProgress((int) ((total * 100) / lenghtOfFile));
                }
                fos.close();
                is.close();
                if (mPDialog != null)
                    mPDialog.dismiss();


                    installApk();


            }catch (Exception e){
                Log.e("UpdateAPP", "Update error! " + e.getMessage());
            }

            return null;
        }

       @Override
       protected void onPreExecute(){
            super.onPreExecute();
            if (mPDialog != null)
                mPDialog.show();
       }

       @Override
        protected void onProgressUpdate(Integer... values){
            super.onProgressUpdate(values);
            if (mPDialog != null){
                mPDialog.setIndeterminate(false);
                mPDialog.setMax(100);
                mPDialog.setProgress(values[0]);
            }
       }

       @Override
        protected void  onPostExecute(String result){
            if (mPDialog != null){
                mPDialog.dismiss();
            }

            if (result != null)
                Toast.makeText(mContext, "Download error: " + result, Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(mContext, "App Downloaded", Toast.LENGTH_SHORT).show();
       }

       private void  installApk(){
            try {
                String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
                File file = new File(PATH + "/...apk");
                Intent intent = new Intent(Intent.ACTION_VIEW);

                if (Build.VERSION.SDK_INT >= 24){
                    Uri downloaded_apk = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".provider", file);
                    intent.setDataAndType(downloaded_apk, "application/vnd.android.package-archive");
                    List<ResolveInfo> resolveInfoList = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
                    for (ResolveInfo resolveInfo : resolveInfoList){
                        mContext.grantUriPermission(mContext.getApplicationContext().getPackageName() + ".provider", downloaded_apk, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    }
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    startActivityForResult(intent, 1);
                }else{
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
                    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                startActivityForResult(intent, 1);


            }catch (Exception e){
                e.printStackTrace();
            }
       }


    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1){

            DeleteApk();

            Toast.makeText(getActivity(), "Result???", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onStart() {

        DeleteApk();

        super.onStart();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }



    public void DeleteApk(){

        String PATH = Objects.requireNonNull(getActivity().getExternalFilesDir(null)).getAbsolutePath();
        File file = new File(PATH);
        boolean isCreate = file.mkdir();
        File outputFile = new File(file, "............ .apk");



        if (outputFile.exists()){

            boolean isDelete = outputFile.delete();

        }

    }



}
```


----------



## Jw456 (16. Aug 2021)

Hallo
Also ich hatte den Code aus dem link auch mal getestet.

-  onPause  geht nicht klar die Datei ist früher gelöscht aus sie installiert wird.

-  onStop ging super die Datei wurde nach dem beenden der App oder beim  wechseln   auf eine andere Activity  gelöscht. Richtiges verhalten:

-  onDestroy  habe ich nicht getestet.


Das mit startActivityForResult habe ich getestet leider bekommt du kein Activity.RESULT_OK  von dem gestarteten Intent zurück.  Die apk die der Intent aufruft ist scheinbar nicht für Start mit Result  geschrieben.


„Probleme mit dem Parsen....“ das Kommt weil die APK schon gelöscht wurde bevor es Installiert  wurde.


Ich würde Die APK Datei auch in den App eignen internen Speicher laden. Wenn die APK nicht extrem gross ist sollte das gehen . andiesen Speicher kommst nur die App selber oder Root ran. Da kommst du nicht mal mir dem PC  und USB Kabel ran.
Auch kein File Explorer auf dem Handy ausser du hast Root rechte.
(bevor jetzt der Einwand kommt doch mit ADB oder Recovery   das lassen wir mal außen vor)

Sollte also das löschen mal nicht klappen kommt der User nicht so leicht an die Datei ran.


```
String PATH = Objects.requireNonNull(mContext.getFilesDir()).getAbsolutePath();
```

Da brauchst du eigentlich auch die Permissions nicht.

PS. eines noch  AsyncTask ist ab API 30  deprecated.


----------



## Jw456 (16. Aug 2021)

wer112 hat gesagt.:


> Es wurde nur der Toast von onStop angezeigt. onPause und onDetech wurde ja nicht angezeigt.


Wenn   der Toast onStop gekommen ist wurde onPause auch durchlaufen.
Der Toast ist hier etwas langsam.  Benutze zum prüfen besser Log und die Logcat.


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> onStop ging super die Datei wurde nach dem beenden der App oder beim wechseln auf eine andere Activity gelöscht.


Ja alle Livecycle Methoden haben an sich die Datei gelöscht. Leider ist überall die Datei eher gelöscht, bevor sie Ja installiert wurden ist...



Jw456 hat gesagt.:


> - onDestroy habe ich nicht getestet.


onDestroy hat kein einzigen Toast von sich gegeben, als es nicht "benutzt" wird...
Was kann das? bzw. Stört das nicht beim Installieren, aber ist sinnvoll?



Jw456 hat gesagt.:


> Das mit startActivityForResult habe ich getestet leider bekommt du kein Activity.RESULT_OK von dem gestarteten Intent zurück.


Ich bekomme ja einen Result zurück, wenn ich bei der Installation auf Abbrechen bzw. die Zurück Taste drücke. Der Toast wird immer dann angezeigt....



Jw456 hat gesagt.:


> Die apk die der Intent aufruft ist scheinbar nicht für Start mit Result geschrieben.


Was meinst du damit????



Jw456 hat gesagt.:


> Ich würde Die APK Datei auch in den App eignen internen Speicher laden.


Ist die das nicht?? Die wird ja im internen Speicher unter Android/data/.../file  doch geladen, oder meinst du woanders?


Jw456 hat gesagt.:


> String PATH = Objects.requireNonNull(mContext.getFilesDir()).getAbsolutePath();


Habe es gerade ausprobiert und wie es aussieht, funktioniert es. Aber ich muss aber einen Weg finden, wie das wieder gelöscht wird, da der Speicher auch irgendwann voll wird. Ich weiß ja nicht, wie viele Apps ein Nutzer installiert.....


----------



## Jw456 (16. Aug 2021)

Also mit wenn du den user nach dem Download ud Installation zwingst die Activity oder das Fragment zu verlassen geht es. Nach den Download wird ja gleich der Intent gestartet. Es wird der Focus der Activity verlassen onPause wird aufgerufen aber nicht onStart.


onDestroy wir beim kompletten beenden der App aufgerufen meistens wenn der Task beendet wird.

Ich bekomme ja einen Result zurück, wenn ich bei der Installation auf Abbrechen bzw. die Zurück Taste drücke. Der Toast wird immer dann angezeigt....


Nein du bekommst nicht richtiges zurück. Du bekommst immer 0 egal ob es installiert wurde oder auch wenn es nicht installiert wurde . Auch der zurück geschickte Intent ist Null.
Keine Sinnvolle Info . ist nicht zu gebrauchen.




```
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 111) {
            Log.d("test", "Result Code : " + resultCode);
            Log.d("test", "Result data  : " + data);
            if (resultCode == RESULT_OK) {
                Log.d("test", "Result OK : " + resultCode);

            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
```


----------



## mrBrown (16. Aug 2021)

Kannst du noch mal in _einfachen Worten_ beschreiben *was* du machen und *warum* du das auf diesem Weg machen möchtest und *wofür* du das brauchst?


----------



## wer112 (16. Aug 2021)

mrBrown hat gesagt.:


> Kannst du noch mal in _einfachen Worten_ beschreiben *was* du machen und *warum* du das auf diesem Weg machen möchtest und *wofür* du das brauchst?


Was meinst du damit? Auf was bezieht sich diese Frage von dir?


----------



## mrBrown (16. Aug 2021)

wer112 hat gesagt.:


> Was meinst du damit? Auf was bezieht sich diese Frage von dir?


Die Frage bezieht sich auf diesen ganzen Thread. Ursprünglich wolltest du Apps installieren, dann deinstallieren, irgendwann erwähnst du mal, dass das eine Sicherheitsmaßnahme ist, damit Nutzer nicht an die APK kommen, ...

Das ganze klingt entweder nach völligem Unsinn oder nach einem XY-Problem. In beiden Fällen würde es helfen, in einfachen Worten zu beschreiben, was dein Ziel ist.


----------



## Jw456 (16. Aug 2021)

mrBrown hat gesagt.:


> Die Frage bezieht sich auf diesen ganzen Thread. Ursprünglich wolltest du Apps installieren, dann deinstallieren, irgendwann erwähnst du mal, dass das eine Sicherheitsmaßnahme ist, damit Nutzer nicht an die APK kommen, ...
> 
> Das ganze klingt entweder nach völligem Unsinn oder nach einem XY-Problem. In beiden Fällen würde es helfen, in einfachen Worten zu beschreiben, was dein Ziel ist.


Das mit der Sicherheit habe ich im ja ach gesagt das es nicht viel Sinn macht die runter geladen apk zu schützen. 

Weil man auch über abdrere Wege daran kommt.


----------



## wer112 (16. Aug 2021)

mrBrown hat gesagt.:


> Die Frage bezieht sich auf diesen ganzen Thread. Ursprünglich wolltest du Apps installieren, dann deinstallieren, irgendwann erwähnst du mal, dass das eine Sicherheitsmaßnahme ist, damit Nutzer nicht an die APK kommen, ...
> 
> Das ganze klingt entweder nach völligem Unsinn oder nach einem XY-Problem. In beiden Fällen würde es helfen, in einfachen Worten zu beschreiben, was dein Ziel ist.


Richtig. Ich bereite eine App jetzt vor, dass sowas ist, wie der Play Store, wo der Nutzer in dem "Store" Apps runterladen kann und installieren. Wenn der Nutzer ja die App installiert hat, kann er aus dem Store die App öffnen oder er kann Sie wieder deinstallieren. 

Wenn ein Entwickler z.b. Mojang eine App in dem "Store" hochlädt z.B. Minecraft und dafür Geld verlangt z.B 5€ darf ja die Apk nicht aus der Sicht des Stores nicht auf dem Handy bleiben, sonst könnte jemand z.B. Mincraft kaufen und anschließend die App kostenlos irgenwo hochladen und dem Entwickler dadurch erheblichen schaden verursachen. Deswegen muss ich alles Menschliche tun, das es vom Store aus gesehen, die Apk sich nicht verbreitet. Ich kann aber nicht verhindern, dass der Nutzer eine andere App z.B MyAppSharer und somit wieder eine Apk hat.

Und ich würde ungern alle "Probleme in ein Thread" reinsetzen, da sonst andere, die das Problem auch haben, es sonst nicht finden kann. Bzw. Alles durcheinander ist. 

Wenn Sie weitere Fragen haben, kann ich ihnen gerne behilflich sein!


----------



## mrBrown (16. Aug 2021)

wer112 hat gesagt.:


> Wenn ein Entwickler z.b. Mojang eine App in dem "Store" hochlädt z.B. Minecraft und dafür Geld verlangt z.B 5€ darf ja die Apk nicht aus der Sicht des Stores nicht auf dem Handy bleiben, sonst könnte jemand z.B. Mincraft kaufen und anschließend die App kostenlos irgenwo hochladen und dem Entwickler dadurch erheblichen schaden verursachen.


Aus Sicht des Stores bleibt die Apk auf dem Handy. Wenn du die App einmal geladen hast, kannst du mit der APK machen, was du willst.


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> Das mit der Sicherheit habe ich im ja ach gesagt das es nicht viel Sinn macht die runter geladen apk zu schützen.
> 
> Weil man auch über abdrere Wege daran kommt.


Ja, dass weiß ich, z.B.: mit MyAppSharer. Aber ich muss dafür sorge tragen, das die Nutzer nicht über diese App an die Apk ran kommt, was ich ja nicht verhindern kann, wenn jemand eine externe App oder gerootes Gerät benutzt. Das ist dann für alle Entwickler das Risiko, das mansche es hinbekommen. Darum versuche ich ja alles daran zu setzten um für die "Normalos" zu verhindern....


----------



## wer112 (16. Aug 2021)

mrBrown hat gesagt.:


> Aus Sicht des Stores bleibt die Apk auf dem Handy. Wenn du die App einmal geladen hast, kannst du mit der APK machen, was du willst.


Man darf nicht machen, was man will. Der Verkäufer(Der Entwickler) will das ja nicht. Das seine App kostenlos weiter gegeben wird.
Das ist wie, ich kaufe für die PS5 das Spiel GTA5 und dann kopiere ich das auf unendliche CDs und verkaufe die jeweils für 5€ das Stück. Deswegen muss ich sorge trage, das aus meiner Sicht die Apk nach Installation gelöscht wird, damit keine Raubkopien der App, jeden meiner Schuld in umlauf kommt. Und wenn die Apk nicht gelöscht wird, geht der Speicher Platz voll.


----------



## mrBrown (16. Aug 2021)

wer112 hat gesagt.:


> Man darf nicht machen, was man will. Der Verkäufer(Der Entwickler) will das ja nicht. Das seine App kostenlos weiter gegeben wird.


Können und Dürfen sind zwei unterschiedliche Dinge.



wer112 hat gesagt.:


> Das ist wie, ich kaufe für die PS5 das Spiel GTA5 und dann kopiere ich das auf unendliche CDs und verkaufe die jeweils für 5€ das Stück.


Was du durchaus machen kannst. Ob du es darfst und ob die Käufer dann etwas damit anfangen können ist eine andere Frage.


----------



## Jw456 (16. Aug 2021)

Ich habe dir gesagt wenn du willst das die geladene app nur auf dem handy läuft auf dem es geladen wurde.
Mußt du eine Prüfung mit signifikanten daten des Handys machen.
Google macht das mit dem google account. Es wird vor dem Download von Google eine genau für deinen Account signiert apk auf den Server von Google erstellt die du dann bekommst.

Jeder Google Account bekommt sozusagen eine eigene apk zugeschickt. Somit ist sicher das sie nur auf Handys mit deinem Account läuft.


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> Ich habe dir gesagt wenn du willst das die geladene app nur auf dem handy läuft auf dem es geladen wurde.
> Müßt du eine Prüfung mit signifikanten daten des Handys machen.
> Google macht das mit dem google account. Es wird vor dem Download von Google eine genau für deinen Account signierte apk auf den Server von Google erstellt die du dann bekommst.
> 
> Jeder Google Account bekommt sozusagen eine eigene apk zugeschickt. Somit ist sicher das sie nur auf Handys mit deinem Account läuft.


Ist ansicht keine Schlechte Idee, aber für mich eher nicht umsetzbar. Das müsste dann mein Programmierer versuchen. Aber die Apk muss trotzdem ja gelöscht werden, wegen Speicherplats. Google löscht die bestimmt auch nach der Installation, sonst währe ja das Handy schnell voll...


----------



## Jw456 (16. Aug 2021)

Das geht ja auch. Habe ich dir doch schon gezeigt.


----------



## Jw456 (16. Aug 2021)

Datei löschen und deinstallieren sind verschiedene Sachen.


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> Datei löschen und deinstallieren sind verschiedene Sachen.


Ja gelöscht wird nur die Apk, aber der Nutzer kann, sowie der Play Store eine Installierte App ja deinstallieren.
Das Deinstallieren, hat ja nixs mit der Apk zu tun. Das ermöglicht ja ein einfaches Deinstallieren einer Installierte App.
Natürlich, muss der Nutzer das Android Fester zustimmen, um die App zu deinstallieren.


----------



## Jw456 (17. Aug 2021)

Mit etwas suche Vileicht das hier. 





						How to uninstall/delete APK Programmatically  in Android
					






					rrtutors.com
				



Wenn du db Code zum installieren verstanden hast ist das deinstallieren fast genauso. 

Tipp mit dem paketmanager ist es auch möglich sich eine Liste über alle installierten Pakete zu bekommen. 

Schaue Doku android.


----------



## Jw456 (17. Aug 2021)

wer112 hat gesagt.:


> Ist ansicht keine Schlechte Idee, aber für mich eher nicht umsetzbar. Das müsste dann mein Programmierer versuchen. Aber die Apk muss trotzdem ja gelöscht werden, wegen Speicherplats. Google löscht die bestimmt auch nach der Installation, sonst währe ja das Handy schnell voll...


Dann wirst du Probleme bekommen oder die Entwickler werden deinen Store nicht benutzen wenn sie für ihre App Geld haben wollen.
Das was du versuchst hat mit sicherheit nicht viel zu tun.

Ein App Programmier weiß wie man an die Apk auf dem handy kommt. Will er nicht das seine App über andere Wege ohne Geld verbreitet werden kann. Wird er deinen Store nicht nutzen.
Da du keine Sicherheit in dieser Richtung bietest.

Ich sehe da auch einige rechtliche steuerliche Probleme.


----------



## wer112 (12. Sep 2021)

Jw456 hat gesagt.:


> Dann wirst du Probleme bekommen oder die Entwickler werden deinen Store nicht benutzen wenn sie für ihre App Geld haben wollen.
> Das was du versuchst hat mit sicherheit nicht viel zu tun.
> 
> Ein App Programmier weiß wie man an die Apk auf dem handy kommt. Will er nicht das seine App über andere Wege ohne Geld verbreitet werden kann. Wird er deinen Store nicht nutzen.
> ...


Ich weiß gerade nicht wo du hinwillst...


----------



## Jw456 (13. Sep 2021)

Was hast du jetzt nicht verstanden?


----------



## wer112 (13. Sep 2021)

Jw456 hat gesagt.:


> Was hast du jetzt nicht verstanden?


Was du geschrieben hast, das kein Enwickler den store benutzen wird. Die bekommen doch das Geld.... Aber erst muss ja der Store fertig sein...

Außerdem gibt es ein Impressum im Menü(Google hat keins), da wird auch alles reingeschrieben...

Habe ja mit deinstall Probleme(geht nur auf s7)... und öffnen stürzt die App ab......
Siehe anderen Post!


----------



## wer112 (16. Sep 2021)

Sorry für den Punkt. Da leider der Result nicht beim installieren funktioniert, kam ich auf eine Idee:

Nachdem die App runtergeladen ist, starten ein Background Prozess, um die Installation zu überwachen, sowie, was der Nutzer geklickt hat(Abrechen, Installieren oder er ist einfach zurückgegangen bzw. raus...)
Je nach dem was der Nutzer geklickt hat, wird was ausgeführt. 
Sollte der Nutzer auf installieren geklickt hat, wird wiederrum überprüft, ob die App erfolgreich installiert ist oder Fehlgeschlagen ist bzw. abgebrochen.

Denn ich würde, dass sehr gerne wie das mit der Deinstall machen, nachdem das deinstalliert ist, dass das Fragment neu geladen wird.
Das würde ich auch gerne machen, nach dem es Installiert ist. Und dannach wird der Prozess beendet.

*Die Frage wäre, wie macht man sowas? Also den Background Prozess inkl. der ganzen Überprüfung?*, damit ich unter anderem das Fragment neu geladen wird, damit der Install Btn verschwindet und der deinstall btn und öffnen btn erscheint....


----------

