Anwendungen auflisten OHNE Systemapps - Problem

  • Antworten:20
Alexander R.
  • Forum-Beiträge: 1.148

16.07.2011, 14:45:18 via Website

Hallo,
ich versuche zurzeit alle installierten Anwendungen (ohne Systemapps) in einer ListView darzustellen.
Leider werden aber dennoch die Systemapps angezeigt, obwohl es auf "INCLUDE_SYSTEM_APPS = false" steht.
Hoffe ihr könnt mir helfen, was ich da falsch gemacht habe...

Ich bekomme die Apps über folgende Funktion:

1private List<App> loadInstalledApps(boolean includeSysApps) {
2 List<App> apps = new ArrayList<App>();
3
4 // the package manager contains the information about all installed apps
5 PackageManager packageManager = getPackageManager();
6
7 List<PackageInfo> packs = packageManager.getInstalledPackages(0);
8
9 for (int i = 0; i < packs.size(); i++) {
10 PackageInfo p = packs.get(i);
11 // Überspringe System Apps, wenn false
12 if ((!includeSysApps) && (p.versionName == null)) {
13 continue;

14 }
15 App app = new App();
16 app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
17 app.setPackageName(p.packageName);
18 app.setVersionName(p.versionName);
19 app.setVersionCode(p.versionCode);
20 app.setInstallDir(p.applicationInfo.sourceDir);
21 app.setInstallSize(calculateSize(app.getInstallDir()));
22 CharSequence description = p.applicationInfo
23 .loadDescription(packageManager);
24 app.setDescription(description != null ? description.toString()
25 : "");
26 apps.add(app);
27 }
28 return apps;
29 }

In die Liste werden sie in der onCreate über folgendes Geschrieben:
1/* whether or not to include system apps */
2 private static final boolean INCLUDE_SYSTEM_APPS = false;
3
4 private ListView mAppsList;
5 private AppListAdapter mAdapter;
6 private List<App> mApps;
7
8 /** Called when the activity is first created. */
9 @Override
10 public void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.applist);
13
14 mAppsList = (ListView) findViewById(R.id.app_list_view);
15 mAppsList.setOnItemClickListener(this);
16
17 mApps = loadInstalledApps(INCLUDE_SYSTEM_APPS);
18
19 mAdapter = new AppListAdapter(getApplicationContext());
20 mAdapter.setListItems(mApps);
21 mAppsList.setAdapter(mAdapter);
22 }

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

20.07.2011, 21:00:27 via App

Jemand eine Idee?

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

22.07.2011, 18:07:09 via Website

Danke Jörg, nun klappt es folgendermassen

1private List<App> loadInstalledApps(boolean includeSysApps) {
2 List<App> apps = new ArrayList<App>();
3
4 // the package manager contains the information about all installed apps
5 PackageManager packageManager = getPackageManager();
6
7 List<PackageInfo> packs = packageManager.getInstalledPackages(0); // PackageManager.GET_META_DATA
8
9 for (int i = 0; i < packs.size(); i++) {
10 PackageInfo p = packs.get(i);
11 // skip system apps if they shall not be included
12 if ((!includeSysApps) && (p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
13 continue;
14 }
15 App app = new App();
16 app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
17 app.setPackageName(p.packageName);
18 app.setVersionName(p.versionName);
19 app.setVersionCode(p.versionCode);
20 app.setInstallDir(p.applicationInfo.sourceDir);
21 app.setInstallSize(calculateSize(app.getInstallDir()));
22 CharSequence description = p.applicationInfo
23 .loadDescription(packageManager);
24 app.setDescription(description != null ? description.toString()
25 : "");
26 apps.add(app);
27 }
28 return apps;
29 }

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

04.08.2011, 20:29:49 via App

Gibt es eine Möglichkeit die Liste alphabetisch sortieren zu lassen?
Ich habe es schon mit Collections.sort(); versucht, leider hat dies nicht funktioniert...
Hat jemand einen Anhaltspunkt für mich?

Ich habe schon einen Comparator fürs Alphabet geschrieben:
1private static final Comparator alph = new Comparator<String>() {
2 @Override
3 public int compare(String arg0, String arg1) {
4 return arg0.toLowerCase().compareTo(arg1.toLowerCase());
5 }
6 };

— geändert am 04.08.2011, 20:32:46

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

06.08.2011, 12:55:48 via App

jemand eine idee?

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 12:43:54 via App

Alexander R.
Gibt es eine Möglichkeit die Liste alphabetisch sortieren zu lassen?
Ich habe es schon mit Collections.sort(); versucht, leider hat dies nicht funktioniert...
Hat jemand einen Anhaltspunkt für mich?

Ich habe schon einen Comparator fürs Alphabet geschrieben:
1private static final Comparator alph = new Comparator<String>() {
2 @Override
3 public int compare(String arg0, String arg1) {
4 return arg0.toLowerCase().compareTo(arg1.toLowerCase());
5 }
6 };

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 14:12:47 via App

Dann schreib doch einen Comparator für dein App-Objekt?
Lg Ansgar

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 14:50:48 via Website

Ich habe es nun folgendermassen gemacht:

Einen Comparator geschrieben:
1package de.rocky.info;
2
3import java.util.Comparator;
4
5public class AppByNameComparator implements Comparator<App>
6{
7 public int compare(App o1, App o2) {
8 return o1.getTitle().compareToIgnoreCase(o2.getTitle());
9 }
10}

Und dann bei meinem loadInstalledApps() aufruf:
1private List<App> loadInstalledApps(boolean includeSysApps) {
2 List<App> apps = new ArrayList<App>();
3
4 // the package manager contains the information about all installed apps
5 PackageManager packageManager = getPackageManager();
6
7 List<PackageInfo> packs = packageManager.getInstalledPackages(0); // PackageManager.GET_META_DATA
8
9 for (int i = 0; i < packs.size(); i++) {
10 PackageInfo p = packs.get(i);
11 // skip system apps if they shall not be included
12 if ((!includeSysApps)
13 && (p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
14 && (p.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
15 continue;
16 }
17 App app = new App();
18 app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
19 app.setPackageName(p.packageName);
20 app.setVersionName(p.versionName);
21 app.setVersionCode(p.versionCode);
22 app.setInstallDir(p.applicationInfo.sourceDir);
23 app.setInstallSize(calculateSize(app.getInstallDir()));
24 CharSequence description = p.applicationInfo
25 .loadDescription(packageManager);
26 app.setDescription(description != null ? description.toString()
27 : "");
28 apps.toArray();
29 Collections.sort(apps, new AppByNameComparator());
30 apps.add(app);
31 }
32 return apps;
33 }

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 14:56:25 via App

Was nur leider sehr ineffizient ist.
Wofür ist apps.toArray(); ?
Warum sortierst du in der For-Schleife und nicht einfach einmal am Schluss?
Lg Ansgar

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 15:06:27 via Website

Dachte, man braucht ne Array Liste dafür...

Geh nun so:

1private List<App> loadInstalledApps(boolean includeSysApps) {
2 List<App> apps = new ArrayList<App>();
3
4 // the package manager contains the information about all installed apps
5 PackageManager packageManager = getPackageManager();
6
7 List<PackageInfo> packs = packageManager.getInstalledPackages(0); // PackageManager.GET_META_DATA
8
9 for (int i = 0; i < packs.size(); i++) {
10 PackageInfo p = packs.get(i);
11 // skip system apps if they shall not be included
12 if ((!includeSysApps)
13 && (p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
14 && (p.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
15 continue;
16 }
17 App app = new App();
18 app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
19 app.setPackageName(p.packageName);
20 app.setVersionName(p.versionName);
21 app.setVersionCode(p.versionCode);
22 app.setInstallDir(p.applicationInfo.sourceDir);
23 app.setInstallSize(calculateSize(app.getInstallDir()));
24 CharSequence description = p.applicationInfo
25 .loadDescription(packageManager);
26 app.setDescription(description != null ? description.toString()
27 : "");
28 apps.add(app);
29 }
30 Collections.sort(apps, new AppByNameComparator());
31 return apps;
32 }

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 18:07:55 via Website

Nun möchte ich anstatt dem Namen das Datum Vergleichen und nach dem neusten sortieren lassen.
Dafür habe ich folgenden Comparator geschrieben:

1package de.rocky.info;
2
3import java.util.Comparator;
4
5public class AppByDateComparator implements Comparator<App>
6{
7 App app = new App();
8 public int compare(App o1, App o2) {
9 return o1.setDate(app.getDate()).compareToIgnoreCase(o2.setDate(app.getDate()));
10 }
11}

Dort gibt es nun folgenden Fehler:
Cannot invoke compareToIgnoreCase(void) on the primitive type void
Jemand eine Ahnung, wie ich es richtig vergleichen kann?

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 19:37:02 via App

Du scheinst Java leider noch nicht verstanden zu haben :(
Schau dir bitte mal Methoden und Rückgabeparameter an; besonders 'void'.
Lg Ansgar
P.S. Warum erzeugst du eigentlich eine neue App ("app") und vergleichst mit der?

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 19:58:47 via App

App app ist eine Klasse, die mir von den installierten Anwendungen die Größe, Name etc zuruckliefern

Kannst du mir einen Anhaltspunkt geben, was daran falsch ist?
void muss etwas zurückgeben

Gruß Alexander

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

09.08.2011, 20:49:53 via Website

Diese drei Zeilen sind der beste Nonsens den ich nach langer Zeit gesehen habe:

1App app = new App();
2public int compare(App o1, App o2) {
3 return o1.setDate(app.getDate()).compareToIgnoreCase(o2.setDate(app.getDate()));
4}

Da wird also im App-Comparator eine leere App angelegt und pro Durchlauf wird das Datum aus dem leeren App über das gefüllte Datum des linken wie rechten App geknallt und anschließend werden die beiden leeren App-Daten miteinander verglichen und retourniert --> void.

Ich finde den Thread echt gut.

Ansgar M

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 21:06:42 via Website

Schon Gut Harald,
habs schon verstanden:

1public class AppByDateComparator implements Comparator<App>
2{
3 int date;
4 public int compare(App o1, App o2) {
5 try {
6 date = o1.getDate().compareToIgnoreCase(o2.getDate());
7 } catch (NameNotFoundException e) {
8 // TODO Auto-generated catch block
9 e.printStackTrace();
10 }
11 return date;
12 }
13}

Nur wie kann ich es nun noch korrekt nach dem Datum sortieren?
Also dass das neuste oben und das älteste unten ist?
Bisher sortiert ers nur nach Tag,Monat,Jahr

Also 30.07.2011 -> 30.06.2011 -> 01.08.2011

— geändert am 09.08.2011, 21:30:25

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 21:46:03 via Website

Dann wandel dein Datum doch in Millisekunden seit 1970 um (Unix Time).
Lg Ansgar
edit: Und nicht als String testen.. :P

— geändert am 09.08.2011, 21:47:23

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

09.08.2011, 23:48:21 via Website

Sorry Alexander, aber Du hast nichts verstanden.

Du feuerst ohne Sinn und Verstand eine Frage nach der anderen ab ohne erkennbar nachhaltigen Nutzen daraus zu ziehen.

Was hast Du eigentlich gegen das Lesen eines Java Grundlagenbuchs - und ich meine wirklich lesen, nicht nur besitzen? Spätestens auf Seite 68, in maximal zwei Tagen zu schaffen, sind geschätzte 95% Deiner Fragen obsolet. So'n Buch kann man mit ins Bett nehmen, auf'm Klo lesen, in der Bahn lesen und hat schwuppdiwupp in ansonst toter Zeit etwas für seine persönliche Bildung getan. Und auf diese Art Erlerntes bleibt hängen. Das Kopieren von vorgekautem Code bleibt nicht hängen. Wenn da mal String statt long steht musst Du dann leider wieder fragen.

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.08.2011, 20:33:39 via Website

Hallo,
habe es nun hinbekommen:

1package de.rocky.info;
2
3import java.util.Comparator;
4
5import android.content.pm.PackageManager.NameNotFoundException;
6
7public class AppByDateComparator implements Comparator<App>
8{
9 int date;
10 public int compare(App o1, App o2) {
11 try {
12 date = o2.getMilli().compareToIgnoreCase(o1.getMilli());
13 } catch (NameNotFoundException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 }
17 return date;
18 }
19}

1public String getMilli() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long lastModified = new File(sourceDir).lastModified();
8 Date date = new Date(lastModified);
9 SimpleDateFormat formatter = new SimpleDateFormat(
10 "yyyy.MM.dd HH:mm:ss.SSS");
11 installDate = formatter.format(date);
12 return installDate;
13 }

Gruß Alexander

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

13.08.2011, 11:48:36 via Website

Sehe ich das richtig? Die Millis sind nicht Bestandteil Deiner App Klasse und Du feuerst die Konvertierung von getMilli() für jeden Comparator-Durchlauf zweimal?

Lehn Dich bitte mal kurz zurück und überlege was der Comparator macht? Er bekommt ein Array von vielleicht 100 Apps - was passiert dann? Wie läuft die Sortierung mit Hilfe des Comparators ab? Zur Not hol mal das dicke Java Buch aus dem Schrank und guck nach.

Was glaubst Du wie viele Vergleiche (Comparator-Durchläufe) im Schnitt notwendig sind um dieses Array nach dem Text-Datum zu sortieren?

Für jedes verdammte Item in dem Array wird wieder und immer wieder die Berechnung der Millis durchgeführt. <Kid-Slang-On>Voll blöd das<Kid-Slang-Off>

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

13.08.2011, 12:44:07 via App

Dann werde ich mir mal mein Java Buch zu gemüte führen und mich dann nochmal melden

Gruß Alexander

Ansgar M

Antworten