Apk automatisch installieren per Button

wer112

Top Contributor
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:

Java:
 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();


    }
    */


Java:
 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

Top Contributor
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

Top Contributor
Um eine APK zu Installieren brauchst du den PacketManager .
Und wie macht man das? Ich habe eigentlich nur sowas gefunden...
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.
 

M.L.

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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.
 

LimDul

Top Contributor
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:

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

Verwendung des Root-Zugriffs zur Installation der F-Droid-Rechteerweiterung als priviliegierte System-<code>-App:

android.permission.ACCESS_SUPERUSER

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

Top Contributor
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

Top Contributor
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
* 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....


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?
 

wer112

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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?
 

wer112

Top Contributor
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:

- 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

Top Contributor
Java:
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
Java:
outputFile.delete()

nach der Installation

PS beim Isntallieren
wird die datei auch wider geöffnet
Java:
                String PATH = Objects.requireNonNull(mContext.getExternalFilesDir(null)).getAbsolutePath();
                File file = new File(PATH + "/my_apk.apk");

wenn fertig könnte sie gelöscht werden.
 
Zuletzt bearbeitet:

wer112

Top Contributor
Java:
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 Ort und die datei erstellt.


also

outputFile.delete()

nach der installation.
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

Top Contributor
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.



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

Top Contributor
> 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


> 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 .
 

wer112

Top Contributor
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

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


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

PS ein Fragment läuft immer in einer Activity.

 

wer112

Top Contributor
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

Top Contributor
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.



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.
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:

Java:
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

Top Contributor
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.

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

Da brauchst du eigentlich auch die Permissions nicht.

PS. eines noch AsyncTask ist ab API 30 deprecated.
 
Zuletzt bearbeitet:

wer112

Top Contributor
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...

- 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?

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....

Die apk die der Intent aufruft ist scheinbar nicht für Start mit Result geschrieben.
Was meinst du damit????

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?
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

Top Contributor
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.



Java:
@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

Super-Moderator
Mitarbeiter
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?
 

mrBrown

Super-Moderator
Mitarbeiter
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

Top Contributor
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

Top Contributor
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

Super-Moderator
Mitarbeiter
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

Top Contributor
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

Top Contributor
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

Super-Moderator
Mitarbeiter
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.

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

Top Contributor
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

Top Contributor
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...
 

wer112

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S *.APK Datei automatisch installieren? Android & Cross-Platform Mobile Apps 4
L Feld eines Eingabeformulars automatisch mit UserID ausfüllen Android & Cross-Platform Mobile Apps 1
J Android PDF Header und Footer automatisch einfügen Android & Cross-Platform Mobile Apps 1
J Android button mithilfe einer Methode automatisch erstellen Android & Cross-Platform Mobile Apps 6
D Startbildschirm -> Automatisch ins Menü weiterleiten Android & Cross-Platform Mobile Apps 3
K Android ListFragment per SimpleCursorAdapter automatisch neufüllen Android & Cross-Platform Mobile Apps 6
J in android app text automatisch kopieren Android & Cross-Platform Mobile Apps 2
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
G unterschiedliches Verhalten beim Installieren des App auf dem Smartphone Android & Cross-Platform Mobile Apps 3
E Android Android installieren Android & Cross-Platform Mobile Apps 3
S Android Android Eclipse Plugin lässt sich nicht installieren Android & Cross-Platform Mobile Apps 4
W Java auf ein CECT Handy installieren Android & Cross-Platform Mobile Apps 6
J MIDlet installieren - Telefon stürzt ab! Android & Cross-Platform Mobile Apps 3
M JDBC optional package. Wie installieren? Android & Cross-Platform Mobile Apps 3
G Programm auf handy installieren Android & Cross-Platform Mobile Apps 3
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
W App deinstallieren per Button & Andere App Öffnen per Button Android & Cross-Platform Mobile Apps 24
W aus Fragmente in andere Klasse wechseln mit Button Android & Cross-Platform Mobile Apps 3
T App updaten via Button Android & Cross-Platform Mobile Apps 10
AGW Android Teilen Button ändern Android & Cross-Platform Mobile Apps 14
A Button in SurfaceView integrieren Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
L Button zum Quadrad zwingen Android & Cross-Platform Mobile Apps 2
S Android Absoluter Neuling: EditText zur Laufzeit verändern bzw. über Button Android & Cross-Platform Mobile Apps 2
L Dialog anzeigen wenn auf Button gedrückt wird. Android & Cross-Platform Mobile Apps 4
S Android ListFragment & ArrayAdapter - Button-Werte werden vergessen Android & Cross-Platform Mobile Apps 0
B Android Abfragen wie lang ein Button gedrückt wurde Android & Cross-Platform Mobile Apps 2
A AlertDialog Enable Button Android & Cross-Platform Mobile Apps 1
J Button array ID Problem Android & Cross-Platform Mobile Apps 2
D Android Activity wechseln per Button Android & Cross-Platform Mobile Apps 3
B Android ringProgressDialog nach Erfolg Button einfärben Android & Cross-Platform Mobile Apps 2
A Android Menü Button oben links Android & Cross-Platform Mobile Apps 1
B Mit Button GeräteEinstellung des Handys öffnen Android & Cross-Platform Mobile Apps 3
M Android Android "Up-Button" extra definieren? Android & Cross-Platform Mobile Apps 1
K Problem mit arraylist und button Android & Cross-Platform Mobile Apps 16
T Button aktivieren per Qullcode... Android & Cross-Platform Mobile Apps 3
T Button geht net... Android & Cross-Platform Mobile Apps 2
D Man sieht nicht ob Button gedrückt wurde! Android & Cross-Platform Mobile Apps 10
K Grafik Tablerow, Button erstreckt sich in der gesamten Breite trotz Beschrenkung durch (max)width Android & Cross-Platform Mobile Apps 2
G Button ein Wert zuweisen Android & Cross-Platform Mobile Apps 5
M 20 Image Button für jede Auflösung positionieren Android & Cross-Platform Mobile Apps 3
B Android Button erstellen nach Vorlage Android & Cross-Platform Mobile Apps 4
L Android Button mit Pfeil nach rechts Android & Cross-Platform Mobile Apps 1
M Einzel Verarbeitung welcher Button angeklickt wurde? Android & Cross-Platform Mobile Apps 6
G Back-Button Methode überschreiben Android & Cross-Platform Mobile Apps 2
P Android Option Button Android & Cross-Platform Mobile Apps 4
G Check Button ist unchecked trotz setChecked(true) Android & Cross-Platform Mobile Apps 6
G Android Button mit Bild Android & Cross-Platform Mobile Apps 4
W Android App Programmierung - Button ganz transparent machen Android & Cross-Platform Mobile Apps 3
L Custom Dialog Button event Android & Cross-Platform Mobile Apps 2
J Button rechtsbündig Android & Cross-Platform Mobile Apps 5
A Android Button Array? Android & Cross-Platform Mobile Apps 6
P Android Button mit bild versehen Android & Cross-Platform Mobile Apps 4
J "Button" auf List erstellen Android & Cross-Platform Mobile Apps 4
U Fire button und Command.BACK, 1 kommen sich in die quere Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben