# App deinstallieren per Button & Andere App Öffnen per Button



## wer112 (16. Aug 2021)

Leider wenn ich im Internet irgendwelchen Intent Code finde, wo man eine App per Knopf Druck löschen kann, funktioniert es bei mir nicht.
Ich benötige einen Code, der nicht in ca. 4 Sätze geschrieben ist, der per Knopf Druck, eine installierte App deinstalliert. Man drückt auf deinstallieren und dann erscheint das typische deinstallieren Fenster, wo der Nutzer die App deinstallieren kann...
Kennt ihr einen sehr großen Code, wo das problemloas funktioniert?

Und ich suche außerdem einen Code, der eine Andere App per Button startet. Der Code darf kein kleiner Intent sein, da kleine Intents nie funktionieren...


*
Noch was Zusätzliches(Will nicht immer ein Extra Thema aufmachen 🙄😉):*

Ich habe ein Installieren Button, der mit match_parent ist. Der Button ist sichtbar. Ist, aber die App bereits Installiert, dann wird der Install Button unsichtbar geschalten und an der gleichen Stelle der Deinstallieren Button und der Öffnen Button. Ich wollte, dass die Buttons den Platz entsprechend teilen. Die Buttons sind nebeneinander.
Dachte ich könnte bei beiden match_parent machen, was überhaupt nicht funktioniert hatte. 

*Wie kann ich den Deinstall Button und den Öffnen Button beide auf Warp bekommen?, da ja jede Sprache unterschiedlich groß ist und die Buttons entsprechend vergrößert bzw. verkleinert werden muss?

Das ist der Code Ausschnitt der Buttons:*


```
<Button
                    android:id="@+id/install_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="25dp"
                    android:layout_marginLeft="25dp"
                    android:layout_marginRight="25dp"
                    android:background="@drawable/install_button_style"
                    android:text="Installieren"
                    android:textColor="#e714c8"
                    android:textSize="17sp"
                    android:textStyle="bold" />

                <Button
                    android:id="@+id/deinstall_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="25dp"
                    android:layout_marginLeft="25dp"
                    android:layout_marginRight="10dp"
                    android:background="@drawable/deinstall_button_style"
                    android:text="Deinstallieren"
                    android:visibility="invisible"
                    android:textColor="#e714c8"
                    android:textSize="17sp"
                    android:textStyle="bold" />

                <Button
                    android:id="@+id/oeffnen_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/deinstall_button"
                    android:layout_marginTop="25dp"
                    android:layout_marginLeft="25dp"
                    android:layout_marginRight="25dp"
                    android:background="@drawable/oeffnen_button_style"
                    android:text="Öffnen"
                    android:visibility="invisible"
                    android:textColor="#ffffff"
                    android:textSize="17sp"
                    android:textStyle="bold" />
```


*Und So sieht es aktuell aus, wenn ein Nutzer die App bereits installiert hat:



Wie ihr seht, ist der Deinstall Button zu Klein für das Wort. Wie kann ich auf beiden Button Warp legen , damit die Buttons an die Schriftgröße angepasst werden kann????*


----------



## Jw456 (16. Aug 2021)

> Und ich suche außerdem einen Code, der eine Andere App per Button startet. Der Code darf kein kleiner Intent sein, da kleine Intents nie funktionieren...


Da würde ich sagen schaue dir die beiden Arten von intens an. 
Es gibt einen implziten und expliziten Intent. 
Android Grundlagen würde ich an dieser Stelle mal sagen.


----------



## Jw456 (16. Aug 2021)

Warum zwei Button  du brauchst 
ihm ja nur einen anderen Text im Java Code geben. Auch die Farbe lässt sich zu Laufzeit im Java Code ändern. 
Wenn du listener den Text abfragt kannst du entscheiden welcher Code ausgeführt werden soll.


----------



## wer112 (16. Aug 2021)

Jw456 hat gesagt.:


> Warum zwei Button  du brauchst
> ihm ja nur einen anderen Text im Java Code geben.


Wie meinst du das? Damit man die Installieren kann bzw. Deinstallieren oder Öffnen kann...


Jw456 hat gesagt.:


> Auch die Farbe lässt sich zu Laufzeit im Java Code ändern.
> Wenn du listener den Text abfragt kannst du entscheiden welcher Code ausgeführt werden soll.


Ich verstehe gerade garnixs.


----------



## Jw456 (16. Aug 2021)

wer112 hat gesagt.:


> Wie meinst du das? Damit man die Installieren kann bzw. Deinstallieren oder Öffnen kann...
> 
> Ich verstehe gerade garnixs.


Du hast dir doch die Instanz des Button mit findViewById geholt. 
Jetzt kannst du dir ansehen was du alles auf die Instanz ausführen kannst. 
Zb den Text ändern.


----------



## Jw456 (17. Aug 2021)

Zu dem Thema Button.
In welcher art von Layout stecken den die Button?


----------



## wer112 (12. Sep 2021)

Jw456 hat gesagt.:


> Du hast dir doch die Instanz des Button mit findViewById geholt.
> Jetzt kannst du dir ansehen was du alles auf die Instanz ausführen kannst.
> Zb den Text ändern.


Ich kann ein Button nur 2 Funktionen geben. Aber keine 3 Stück auf einmal.... 


Ich habe diesen Code zum deinstallieren genommen: 

[CODE lang="java" title="Deinstallieren"] deinstall_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Uri packageUri = Uri.parse("package:"+packageName);
                    Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageUri);
                    uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, false);
                    startActivity(uninstallIntent);


                }
            });
[/CODE]

Leider funktionier der Code *nur *auf mein Samsung Galaxy S7, aber der Code funktioniert garnicht auf mein S8 & S9+. 
Weißt du, warum das nicht funktioniert? Und was kann ich machen, das der Code bei allen Versionen gescheid funktioniert?

Das andere ist, ich habe ein Intent Code benutzt, um die App zu öffnen, aber leider stürtzt die App sofort ab. Die Intent Codes funktionieren bei mir nicht. Warum klappen die Intent Codes bei mir nicht? Wie kann ich die App normal öffen? (Werde auf den Öffnen Button noch ein Aktualiseren btn drauf legen...)

Das ist der Öffnen Code:

oeffnen_btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {


    Intent i = new Intent();
    i.setAction(Intent.ACTION_VIEW);
    i.setClassName(packageName, packageName);
    startActivity(i);

    }
});


----------



## Jw456 (13. Sep 2021)

install / uninstall APKs programmatically (PackageManager vs Intents)
					

My application installs other applications, and it needs to keep track of what applications it has installed. Of course, this could be achieved by simply keeping a list of installed applications. But




					stackoverflow.com


----------



## Jw456 (13. Sep 2021)

start der APK etwa so 
es muss natürlich der PackageName der zu starten APK sein.  nicht deine APP


```
void statAPK(String apkPackageName ){
        Intent intent = getPackageManager().getLaunchIntentForPackage(apkPackageName);
        startActivity(intent);
    }
```


----------



## wer112 (16. Sep 2021)

Der


Jw456 hat gesagt.:


> start der APK etwa so
> es muss natürlich der PackageName der zu starten APK sein.  nicht deine APP
> 
> 
> ...


Der Start hat Problemlos funktioniert! Danke... Ich habe nur den Intent, sowie der StartAc. genommen, da er ja in ein Btn ist und der PackageName ja also String steht ja oben... Normals dies bezüglich danke!


```
oeffnen_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Intent i = getActivity().getPackageManager().getLaunchIntentForPackage(packageName);
                    startActivity(i);



                }
            });
```


----------



## wer112 (16. Sep 2021)

Jw456 hat gesagt.:


> install / uninstall APKs programmatically (PackageManager vs Intents)
> 
> 
> My application installs other applications, and it needs to keep track of what applications it has installed. Of course, this could be achieved by simply keeping a list of installed applications. But
> ...


Das war sehr unübersichtlich, da es sehr viel verschiedene Cods drinnen stehen.

*Ich habe zum Glück gleich den Richtigen genommen* 😉:


```
deinstall_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Intent i = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
                    i.setData(Uri.parse("package:" + packageName));
                    i.putExtra(Intent.EXTRA_RETURN_RESULT, true);
                    startActivityForResult(i, UNINSTALL_REQUEST_CODE);




                }
            });
```


----------



## Jw456 (16. Sep 2021)

Dann schaue dir doch mal an was du machst.

Du lädst die APK danach startest du einem Intent. Du rufst eine ich sage mal System APP auf.
Du verlässt also den Fokus deine Activity oder Fragment.
Was passiert da in Lifecycle? Und was passiert wenn du von der SystemApp wider zurück in deine Activity oder Fragment kommst?

Richtig es wird die onResume Methode durchlaufen.
So was hindert dich daran in dieser zu prüfen ob die App installiert ist oder nicht und dann auch entsprechend deine Button zu setzen.
In der onStop und in der onPause kannst du alle geladen APK Dateien löschen.
Das Löschen der APK sollte auch in der onResume klappen.


----------



## wer112 (16. Sep 2021)

Jw456 hat gesagt.:


> Dann schaue dir doch mal an was du machst.
> 
> Du lädst die APK danach startest du einem Intent. Du rufst eine ich sage mal System APP auf.
> Du verlässt also den Fokus deine Activity oder Fragment.
> ...


Ich habe mehrmals mit Livecircls gearbeitet, aber da stand immer: Fehler beim Parsen. Ich probiere das gleich aus.... 
Das Löschen würde nicht klappen.

Ich teste das mal jetzt mit dem onResume Methode und melde mich gleich wieder....


----------



## Jw456 (16. Sep 2021)

hier ein einfaches Beispiel


```
public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 200;
    private static final String APKPACKAGENAME = "com.example.hallo_apk";
    Button btn_del;
    Button btn_install;
    Button btn_stat;
    private boolean delFlag = false;

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button);

        btn_del = findViewById(R.id.deinstall_button);
        btn_install = findViewById(R.id.install_button);
        btn_stat = findViewById(R.id.oeffnen_button);


        btn_install.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onClick(View v) {
                if (checkPermission()) {
                    UpdateApp atualizaApp = new UpdateApp();
                    atualizaApp.setContext(MainActivity.this);
                    atualizaApp.execute("http://192.168.0.109/testapk/app-release.apk");

                } else {
                    requestPermission();
                }
            }
        });

        btn_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (checkPermission()) {
                    btn_install.setVisibility(View.VISIBLE);
                    btn_del.setVisibility(View.INVISIBLE);
                    btn_stat.setVisibility(View.INVISIBLE);
                    uninstallAPK(APKPACKAGENAME);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    requestPermission();
                }
            }
        });

        btn_stat.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkPermission()) {
                    btn_install.setVisibility(View.INVISIBLE);
                    btn_del.setVisibility(View.VISIBLE);
                    btn_stat.setVisibility(View.VISIBLE);
                    statAPK(APKPACKAGENAME);
                } else {
                    requestPermission();
                }
            }
        });
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, 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(MainActivity.this);
                    updateApp.execute("http://192.168.0.109/testapk/app-release.apk");
                }
            }
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    private boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(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(this, new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }


    @Override
    protected void onStart() {
        super.onStart();
        deletDir();
    }

    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    protected void onResume() {
        super.onResume();
        if (delFlag) {
            try {
                Thread.sleep(200);
                delFlag = false;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        try {
            if (!getPackageManager().isPackageSuspended(APKPACKAGENAME)) {
                btn_install.setVisibility(View.INVISIBLE);
                btn_del.setVisibility(View.VISIBLE);
                btn_stat.setVisibility(View.VISIBLE);

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


    }

    @Override
    protected void onStop() {
        super.onStop();
        deletDir();
    }

    void deletDir() {
        String PATH = Objects.requireNonNull(this.getFilesDir()).getAbsolutePath();
        File fileDir = new File(PATH);
        File[] files = fileDir.listFiles();
        if (files.length != 0) {
            for (File f : files) {
                f.delete();
            }
        }
    }

    boolean checkAPKInstall(String apkPackageName) {

        boolean b = false;


        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            b = getPackageManager().isInstantApp(apkPackageName);
        }
        return b;
    }

    void uninstallAPK(String apkPackageName) {
        delFlag = true;
        Intent intent = new Intent("android.intent.action.DELETE");
        intent.setData(Uri.parse("package:" + apkPackageName));
        startActivity(intent);
    }

    void statAPK(String apkPackageName) {
        Intent intent = getPackageManager().getLaunchIntentForPackage(apkPackageName);
        startActivity(intent);
    }


    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("Please wait...");
                    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.getFilesDir()).getAbsolutePath();
                File file = new File(PATH);
                boolean isCreate = file.mkdirs();
                File outputFile = new File(file, "my_apk.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_LONG).show();
            else
                Toast.makeText(mContext, "File Downloaded", Toast.LENGTH_SHORT).show();
        }


        private void installApk() {
            try {
                String PATH = Objects.requireNonNull(mContext.getFilesDir()).getAbsolutePath();
                File file = new File(PATH + "/my_apk.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> resInfoList = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
                    for (ResolveInfo resolveInfo : resInfoList) {
                        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);
                    startActivity(intent);
                } 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);
                }
                startActivity(intent);


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


    }// end inner Class
}
```


```
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/install_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginTop="80dp"
        android:layout_marginEnd="8dp"
        android:background="@android:drawable/editbox_background"
        android:text="Installieren"
        android:textColor="#e714c8"
        android:textSize="17sp"
        android:textStyle="bold"
        android:visibility="visible"
        app:layout_constraintEnd_toStartOf="@+id/oeffnen_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/deinstall_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginTop="80dp"
        android:layout_marginEnd="8dp"
        android:background="@android:drawable/editbox_background"
        android:text="Deinstallieren"
        android:textColor="#e714c8"
        android:textSize="17sp"
        android:textStyle="bold"
        android:visibility="invisible"
        app:layout_constraintEnd_toStartOf="@+id/oeffnen_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/oeffnen_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="80dp"
        android:layout_marginEnd="16dp"
        android:layout_toRightOf="@id/deinstall_button"
        android:background="@android:drawable/button_onoff_indicator_on"
        android:text="Öffnen"
        android:textColor="#ffffff"
        android:textSize="17sp"
        android:textStyle="bold"
        android:visibility="invisible"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.589"
        app:layout_constraintStart_toEndOf="@+id/install_button"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>
```


----------



## wer112 (16. Sep 2021)

Jw456 hat gesagt.:


> Dann schaue dir doch mal an was du machst.
> 
> Du lädst die APK danach startest du einem Intent. Du rufst eine ich sage mal System APP auf.
> Du verlässt also den Fokus deine Activity oder Fragment.
> ...


So habe es ausprobiert. Gute Nachricht, wie es aussieht funktioniert das mit dem onResume, dass da geprüft wird, ob die App Installiert ist oder nicht inkl. Bewertung Freigabe oder nicht...

Die Sache mit dem Löschen der Apk ist wie gewohnt Fehlgeschlagen(Fehler beim Paren...).
Mir kam gerade die Idee, während des Schreben dieses Textes, dass ich bei der Überprüfung, ob die App installiert ist, dass ich da das lösche. Vielleicht kann ein specieller Background service dies löschen...


----------



## Jw456 (16. Sep 2021)

Der Code denn ich dir gegeben habe geht bei mir auch unter Android 10. 
Ich hoffe du hast auch die pemission gesetzt.


----------



## wer112 (16. Sep 2021)

Jw456 hat gesagt.:


> Der Code denn ich dir gegeben habe geht bei mir auch unter Android 10.
> Ich hoffe du hast auch die pemission gesetzt.



[CODE lang="java" title="Meine Permissionen"] <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.vendig.Billing" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />


    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>



    <permission
        android:name="android.permission.REQUEST_SUPERUSER"
        androidrotectionLevel="signature" />
    <permission
        android:name="android.permission.REPORT_SUPERUSER"
        androidrotectionLevel="signature" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />[/CODE]



Und Mein aktuelles Fragment...


[CODE lang="java" title="Mein Fragment"]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.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.PorterDuff;
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.ImageView;
import android.widget.TextView;
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;
import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_FIRST_USER;
import static android.app.Activity.RESULT_OK;


public class App_Fragment extends Fragment {

    private static final int PERMISSION_REQUEST_CODE = 200;
    int INSTALL_REQUEST_CODE = 1;
    int UNINSTALL_REQUEST_CODE = 2;

    Button install_btn, deinstall_btn, oeffnen_btn;
    ImageView like, dislike;

    TextView NieInstallText;

    String app_name = "";

    Integer euro = 0;
    Integer cent = 00;

    String apk_url = "";
    String packageName = "";

    String beschreibungstext;

    Integer wurdeschonmalinstalliert = 0;

    Integer bewertung = 0;


    Integer qc_geprueft = 0;

    String app_version = "1.0";

    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);
        deinstall_btn = (Button)fragmentlayout_app_fragment.findViewById(R.id.deinstall_button);
        oeffnen_btn  = (Button)fragmentlayout_app_fragment.findViewById(R.id.oeffnen_button);

        NieInstallText = (TextView)fragmentlayout_app_fragment.findViewById(R.id.text_nieInstalliert);

        like = (ImageView)fragmentlayout_app_fragment.findViewById(R.id.image_like);
        dislike = (ImageView)fragmentlayout_app_fragment.findViewById(R.id.image_dislike);




        SharedPreferences prefsbewertung = getActivity().getSharedPreferences("Bewertung", getActivity().MODE_PRIVATE);
        bewertung = prefsbewertung.getInt("bewertung", bewertung);

        SharedPreferences prefswurdemalinstall = getActivity().getSharedPreferences(packageName, getActivity().MODE_PRIVATE);
        wurdeschonmalinstalliert = prefswurdemalinstall.getInt("wurdeschonmalinstalliert", wurdeschonmalinstalliert);


        Bewertungfreigeben();
        Bewertung();

        like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                bewertung = 1;
                SharedPreferences prefs = getActivity().getSharedPreferences("Bewertung", getActivity().MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putInt("bewertung" , bewertung);
                editor.apply();
                // Toast.makeText(getActivity(), "Bewertung ist: " + bewertung, Toast.LENGTH_SHORT).show();

                Bewertung();
            }
        });

        dislike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bewertung = 2;

                SharedPreferences prefs = getActivity().getSharedPreferences("Bewertung", getActivity().MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putInt("bewertung" , bewertung);
                editor.apply();
                // Toast.makeText(getActivity(), "Bewertung ist: " + bewertung, Toast.LENGTH_SHORT).show();

                Bewertung();
            }
        });



        /*

        AppDatenImport();

         */



                IsAppInstall();








        return  fragmentlayout_app_fragment;
    }

    private void Bewertungfreigeben() {
        switch (wurdeschonmalinstalliert){

            case 0:

                NieInstallText.setVisibility(View.VISIBLE);
                like.setVisibility(View.INVISIBLE);
                dislike.setVisibility(View.INVISIBLE);

                break;


            case 1:


                NieInstallText.setVisibility(View.INVISIBLE);
                like.setVisibility(View.VISIBLE);
                dislike.setVisibility(View.VISIBLE);

                break;
        }
    }

    private void Bewertung() {

        switch (bewertung){
            case 0:
                like.setImageResource(R.drawable.ic_like);
                dislike.setImageResource(R.drawable.ic_dislike);
                break;

            case 1:

                like.setImageResource(R.drawable.ic_like_on);
                dislike.setImageResource(R.drawable.ic_dislike);

                break;

            case 2:

                like.setImageResource(R.drawable.ic_like);
                dislike.setImageResource(R.drawable.ic_dislike_on);

                break;
        }

    }


    private boolean IsAppInstall() {

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

            install_btn.setVisibility(View.INVISIBLE);

            deinstall_btn.setVisibility(View.VISIBLE);
            oeffnen_btn.setVisibility(View.VISIBLE);

            wurdeschonmalinstalliert = 1;
            SharedPreferences prefs = getActivity().getSharedPreferences(packageName, getActivity().MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putInt("wurdeschonmalinstalliert" , wurdeschonmalinstalliert);
            editor.apply();

            DeleteApk();


            deinstall_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Intent i = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
                    i.setData(Uri.parse("package:" + packageName));
                    i.putExtra(Intent.EXTRA_RETURN_RESULT, true);
                    startActivityForResult(i, UNINSTALL_REQUEST_CODE);




                }
            });






            oeffnen_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Intent i = getActivity().getPackageManager().getLaunchIntentForPackage(packageName);
                    startActivity(i);



                }
            });


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


            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 onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == UNINSTALL_REQUEST_CODE){

            if (resultCode == RESULT_OK){
                IsAppInstall();
                Toast.makeText(getActivity(), "Erfolgreich deinstalliert!", Toast.LENGTH_SHORT).show();
            }else if (resultCode == RESULT_CANCELED){

                Toast.makeText(getActivity(), "Deinstallation abgebrochen", Toast.LENGTH_SHORT).show();

            }else if (resultCode == RESULT_FIRST_USER){

                Toast.makeText(getActivity(), "", Toast.LENGTH_SHORT).show();
                Toast.makeText(getActivity(), "Deinstallation fehlgeschllagen!", Toast.LENGTH_SHORT).show();

            }
        }


    }

 */



    @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();

                 */


                String PATH = Objects.requireNonNull(mContext.getFilesDir().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();

                 */


                String PATH = Objects.requireNonNull(mContext.getFilesDir().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, INSTALL_REQUEST_CODE);


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


    }

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


        /*
        if (requestCode == INSTALL_REQUEST_CODE){

            if (resultCode == RESULT_OK){

                Toast.makeText(getActivity(), "Erfolgreich installiert!", Toast.LENGTH_SHORT).show();



                // Wird nie als Installiert angezeigt!





            }else if (resultCode == RESULT_CANCELED){


                Toast.makeText(getActivity(), "installation abgebrochen", Toast.LENGTH_SHORT).show();

            }else if (resultCode == RESULT_FIRST_USER){

                Toast.makeText(getActivity(), "installation fehlgeschlagen!", Toast.LENGTH_SHORT).show();

            }


        }

         */

        if (requestCode == UNINSTALL_REQUEST_CODE){

            if (resultCode == RESULT_OK){




                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                    getActivity().getFragmentManager().beginTransaction().detach(this).commitNow();
                    getActivity().getFragmentManager().beginTransaction().attach(this).commitNow();

                }else{
                    getActivity().getFragmentManager().beginTransaction().detach(this).attach(this).commit();
                }


                /*
                getActivity().finish();
                startActivity(getActivity().getIntent());

                 */


                DeleteApk();



             // Toast.makeText(getActivity(), "Erfolgreich deinstalliert!", Toast.LENGTH_SHORT).show();

            }else if (resultCode == RESULT_CANCELED){

                Toast.makeText(getActivity(), "Deinstallation abgebrochen", Toast.LENGTH_SHORT).show();

            }else if (resultCode == RESULT_FIRST_USER){

                Toast.makeText(getActivity(), "Deinstallation fehlgeschlagen!", Toast.LENGTH_SHORT).show();

            }
        }

    }

    @Override
    public void onStart() {

        DeleteApk();


        super.onStart();
    }

    @Override
    public void onResume() {

        IsAppInstall();
        Bewertungfreigeben();
        super.onResume();
    }



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



    public void DeleteApk(){


                /*

                String PATH = Objects.requireNonNull(getActivity().getExternalFilesDir(null)).getAbsolutePath();

                 */


        String PATH = Objects.requireNonNull(getActivity().getFilesDir().getAbsolutePath());


        File file = new File(PATH);
        boolean isCreate = file.mkdir();
        File outputFile = new File(file, "..apk");



        if (outputFile.exists()){

            boolean isDelete = outputFile.delete();

        }

    }



}[/CODE]


Aber das Löschen (DeleteApk() geht ja nicht unter onStop, onPause,... 

Haube das nur jetzt unter onStart, sowie bei der Install Prüfung.
Da muss ich irgendwie ein Back Service starten, sobald die App gedownloadet ist und wird beendet, wenn Sie installiert oder abgebrochen ist....


----------



## Jw456 (17. Sep 2021)

Dein Problem ist das du StartActivityforResult benutzt.
Ich sagte dir schon das das nicht geht. Die System App  ist nicht so geschrieben das sie dir den Status der user Eingaben zurück gibt. Deine result Methode ist somit auch sinnlos.

Du kannst die User Eingaben nicht überwachen.
Du startest mit dem intent die System App die Kontrolle geht an diese App. Wenn der User fertig ist kommst Du in der onResume an. Hier kannst Du testen ob der user die App installiert hat. Und auch die Apk löschen.

Das löschen in der Result wird nie zufrieden funktionieren.
Du bekommst keinen richtigen Status zurück. Alle Versuche von dir sind sinnlos. 
i.putExtra(Intent.EXTRA_RETURN_RESULT
Ist auch sinnlos


----------



## Jw456 (17. Sep 2021)

Auch beim Deinstallieren ist das StartActivityForResult sinnlos.

Ps dein prüfen ob die App Installiert ist ist auch falsch wird nicht gehn.
das ist kein prüfen.
PackageInfo info = pm.getPackageInfo("", PackageManager.GET_META_DATA);
du gibst nicht mal einen packageName an. Ein If ist auch nicht zu sehen.

Wieso zwei ShPref Datein?


----------



## kneitzel (17. Sep 2021)

Also wenn die Idee ist, dass Du einen eigenen App-Store entwickeln willst: Wieso schaust Du dann nicht auf Dinge, die es schon gibt. Es gibt z.B. F-Droid mit einem Client: https://github.com/f-droid/fdroidclient

Du kannst also jederzeit schauen, wie die an die verschiedenen Dinge heran gegangen sind. Und damit hast Du auch eine solide Grundlage zum Testen von Veränderungen 

Wenn man z.B. auf https://github.com/f-droid/fdroidclient/tree/master/app/src/main/java/org/fdroid/fdroid/installer schaut, dann scheint da einiges an Funktionalität zu sein, die Du dann vermutlich auch noch brauchen wirst.

Aber beachten: Der Code ist unter GPL - einfach kopieren ist also nicht. Aber es geht ja erst einmal um das Was und Wie. Dann kannst Du es selbst so strukturieren, wie Du es gerne möchtest und mit dem gewonnenen Verständnis dann auch selbst bauen.

Neben den Problemen bei der eigentlichen Funktion sehe ich aber auch andere Themen, die ebenfalls wichtig sind:
- Saubere Strukturierung - Damit eine Applikation wartbar bleibt, ist dies zwingend erforderlich
- Unit Tests! Ja, sowas ist auch durchaus wichtig. 

Statt das aber an so vorhandenen Applikationen zu schauen macht es vielleicht mehr Sinn, erst einmal im Detail zu schauen, was man bei developer.android.com an Guides so findet (Developer Guides, Quality Guidelines, ...)

Das sollte es aber auch einfach kurz von meiner Seite nach Beobachtung des Threads.


----------



## wer112 (17. Sep 2021)

Jw456 hat gesagt.:


> Auch beim Deinstallieren ist das StartActivityForResult sinnlos.


Das funktioniert perfekt und kann den Result von der eingabe lesen. Also, wenn der Nutzer auf Okay drückt, habe ich als Toast deinstall erfolgreich, sonst hatte ich immer abgebrochen. Das beim Installieren funktioniert nicht, da es ja 2 faches Fester ist und somit gibt es immer abgebrochen an.
*Ich habe das ja deswegen somit gemacht, wie du es gesagt hattest, dass ich das im Resume reinschreiben soll, dass es da überprüft wird und dann das bei der Überprüfung der APK lösche.*


Jw456 hat gesagt.:


> Ps dein prüfen ob die App Installiert ist ist auch falsch wird nicht gehn.
> das ist kein prüfen.
> PackageInfo info = pm.getPackageInfo("", PackageManager.GET_META_DATA);
> du gibst nicht mal einen packageName an.


Ich gege ein PackageName an (Info(packageName, PackageManager....  (Ich habe innerhalb der Ausführungszeichen den PackageName drinnen.) und er funktioniert perfekt.


Jw456 hat gesagt.:


> Ein If ist auch nicht zu sehen.


Was für ein If?

Entweder ist es Installiert oder nicht. Ich benutze dort ein try und catch Also wenns Installiert ist, ist der Install Btn unsichtbar und dafür die anderen sichtbar, sowie die ganze OnClickListener....


wer112 hat gesagt.:


> } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); install_btn.setOnClickListener(new View.OnClickListener() {





Jw456 hat gesagt.:


> Wieso zwei ShPref Datein?


Ich habe sogar 3. Die werden alle verschwinden, da die ganze Daten aus der Datenbank heraus geholt wird. Das Problem ist, das die ShaPref gelöscht werden, wenn ich alle 3 zusammen führen würde.


----------



## wer112 (17. Sep 2021)

kneitzel hat gesagt.:


> Also wenn die Idee ist, dass Du einen eigenen App-Store entwickeln willst: Wieso schaust Du dann nicht auf Dinge, die es schon gibt. Es gibt z.B. F-Droid mit einem Client: https://github.com/f-droid/fdroidclient


Ich habe damals den Kurz angeschaut, wie er funktioniert, was für mein bisjetzigen Java und Grundlagen Verständnis(Ich entwickle bereits schon weiter....) zu komplizert ist. Bis man alle Seiten analysiert hat, wo es anfängt und aufhört ist sehr schwer zu ermitteln. 



kneitzel hat gesagt.:


> Wenn man z.B. auf https://github.com/f-droid/fdroidclient/tree/master/app/src/main/java/org/fdroid/fdroid/installer schaut, dann scheint da einiges an Funktionalität zu sein, die Du dann vermutlich auch noch brauchen wirst.


Bis jetzt benötige ich, keine haufend Seiten, da die Installation sehr gut bereits klappt. Wenn mein Programmierer irgendwann meint, dass es noch das braucht, um noch Perfekter funktionieren, dann ist das so and er kann dies ja tun...


kneitzel hat gesagt.:


> Aber beachten: Der Code ist unter GPL


Was ist GPL?


kneitzel hat gesagt.:


> - einfach kopieren ist also nicht.


Ist währe ja eh nicht möglich aufgrund der Haufend Seiten. Da kann man eh nixs rauspicken, man müsste schon das ganze nehmen.


kneitzel hat gesagt.:


> Aber es geht ja erst einmal um das Was und Wie. Dann kannst Du es selbst so strukturieren, wie Du es gerne möchtest und mit dem gewonnenen Verständnis dann auch selbst bauen.
> 
> Neben den Problemen bei der eigentlichen Funktion sehe ich aber auch andere Themen, die ebenfalls wichtig sind:
> - Saubere Strukturierung - Damit eine Applikation wartbar bleibt, ist dies zwingend erforderlich


Ich werde bereits sauberer und strukturierter, als früher... Ich weiß, das der Code Aussieht als hätte jemand ihn ausgespuckt. Ich weiß auch, das mein Programmierer das umändern wird, damit er besser zurecht kommt(er macht sein BA) also gehe ich da schon aus, dass er dies richtig gelernt hat.


kneitzel hat gesagt.:


> - Unit Tests! Ja, sowas ist auch durchaus wichtig.


Was meinst du mit Uni Test? Ich teste das nur auf den echten Handys, da Emulatoren bei mir nie gehen.


kneitzel hat gesagt.:


> Statt das aber an so vorhandenen Applikationen zu schauen macht es vielleicht mehr Sinn, erst einmal im Detail zu schauen, was man bei developer.android.com an Guides so findet (Developer Guides, Quality Guidelines, ...)


Für ein erfahrenen Programmierer wie du oder Jw456 ist dies durchaus möglich, auch wenn ich das auf deutsch übersetzen lasse(auto), dann verstehe ich nicht die Verwendung.
Zum Beispiel versuche ich eine einfache ArrayList  hinzubekommen und scheitere daran, erstens gibt es keine Seiten, wo man das sehr gut lernt und zweitens wenn ich eine einfache Deutsche Seite gefunden habe, dann funktioniert der Code garnicht, weil er immer Rot aufleuchtet...


----------



## Jw456 (17. Sep 2021)

deine onCrateView und somit deine IsAppInstall wird nach dem Intent nicht durchlaufen.
Ist bei beiden  der Fall install oder desinstall.

Tipp du brauchst ja nicht die Klicklistener  ein und auszuschalten sondern nur die sichtbarkeit der Button.


----------



## kneitzel (17. Sep 2021)

wer112 hat gesagt.:


> Was ist GPL?


Eine Lizenz - die Gnu Public License. Diese Lizenz regelt, was man darf oder eben nicht darf bzw. was man machen muss, wenn man Teile übernimmt.


wer112 hat gesagt.:


> Was meinst du mit Uni Test? Ich teste das nur auf den echten Handys, da Emulatoren bei mir nie gehen.


Unit Tests - das sind Tests die gewisse Funktionalitäten automatisch testen um sicher zu stellen, dass der Code das macht, was er soll.


----------



## Jw456 (17. Sep 2021)

Etwas zum Verständnis.
Die Listener die du auf die Button gesetzt hast sind auch noch aktiv, wenn du aus deiner in Kommentar gesetzten  Result Methode die IsAppIntall aufrufst.

Außer die onCrateView wird durchlaufen und somit das Layout neu geladen.

Wie ich sagte reicht es die Sichtbarkeit in der onResume zu setzen. Die Listener kannst du auch alle gleich setzen.
Ist ein Button unsichtbar  kann er auch nicht geklickt werden und den Listener auslösen.

Tipp schaue mein beispiel an.


----------

