App deinstallieren per Button & Andere App Öffnen per Button

wer112

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


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


WhatsApp Image 2021-08-16 at 21.01.27.jpeg
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

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

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

Top Contributor

wer112

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

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

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

wer112

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

Java:
void statAPK(String apkPackageName ){
        Intent intent = getPackageManager().getLaunchIntentForPackage(apkPackageName);
        startActivity(intent);
    }
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!

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


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



                }
            });
 

wer112

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

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

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

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

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

Top Contributor
hier ein einfaches Beispiel

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

Java:
<?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>
 
Zuletzt bearbeitet:

wer112

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

wer112

Top Contributor
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"
android:protectionLevel="signature" />
<permission
android:name="android.permission.REPORT_SUPERUSER"
android:protectionLevel="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

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

Top Contributor
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?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
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

Top Contributor
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.
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.
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....
} catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); install_btn.setOnClickListener(new View.OnClickListener() {

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

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

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...
Aber beachten: Der Code ist unter GPL
Was ist GPL?
- 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.
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.
- 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.
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

Top Contributor
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.
 
Zuletzt bearbeitet:
K

kneitzel

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

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
W Apk automatisch installieren per Button Android & Cross-Platform Mobile Apps 55
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
J Android button mithilfe einer Methode automatisch erstellen Android & Cross-Platform Mobile Apps 6
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
W JSONARRAY per Intent an andere Activity übergeben und umwandeln ggbf. Android & Cross-Platform Mobile Apps 1
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
W Pixel Farbe in eine andere Farbe ändern im ImageView von ein Icon Android & Cross-Platform Mobile Apps 14
J Android String in andere Java-Dateien überführen Android & Cross-Platform Mobile Apps 1
J ImageView zeigt kein Bild an, Andere Elemente jedoch sichtbar Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben