как получить список приложений

1

Я получил этот код из Интернета, я полагаю, чтобы получить список всех приложений на телефоне, и, судя по комментариям на веб-странице, он работает, но я просто не могу заставить его работать для меня вообще. это похоже на getPacketManager(), который дает мне проблему. может кто-то, пожалуйста, посмотрите на код и объясните мне, что я должен сделать, чтобы заставить его работать?

это мой полный класс... я не могу заставить его работать даже в трех местах, где есть "getPackageManager()", он дает мне ошибку слева от экрана, говоря "Метод getPackageManager ( ) undefined для типа getApps"

package cians.app;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class getApps{

class PInfo {
private String appname = "";
private String pname = "";
private String versionName = "";
private int versionCode = 0;
private Drawable icon;
private void prettyPrint() {
    System.out.print(appname + "\\t" + pname + "\\t" + versionName + "\\t"            +versionCode + "\\t");
}
}

private void listPackages() {
ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
final int max = apps.size();
for (int i=0; i<max; i++) {
    apps.get(i).prettyPrint();
}
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
ArrayList<PInfo> res = new ArrayList<PInfo>();        
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for(int i=0;i<packs.size();i++) {
    PackageInfo p = packs.get(i);
    if ((!getSysPackages) && (p.versionName == null)) {
        continue ;
    }
    PInfo newInfo = new PInfo();
    newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
    newInfo.pname = p.packageName;
    newInfo.versionName = p.versionName;
    newInfo.versionCode = p.versionCode;
    newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
    res.add(newInfo);
}
return res; 
}}
  • 0
    Можете ли вы быть более конкретным о том, что не работает? Это принудительное закрытие, это просто не возвращает данные? В любом случае, пожалуйста, опубликуйте вывод logcat.
Теги:
android-emulator
android-layout

1 ответ

8
Лучший ответ

getPackageManager() - это метод класса Context, поэтому вы можете вызвать его из любого объекта, который расширяет "Контекст". Класс Activity расширяет контекст, и ваш основной класс расширяет Activity, поэтому вы можете вызвать getPackageManager() из вашего основного объекта класса. Если ваш класс не расширяет Context (это случай класса getApps), вы не можете вызвать getPackageManager() из него. Сначала вам нужно получить контекст своей деятельности.

EDIT:

ОК, вам необходимо передать свою активность в этот класс:

в классе getApps добавьте

private Context parent = null;
public getApps(Context _parent) // a constructor that receives the context as parameter
{
   parent = _parent;
}

public String getInfo() { // your implementation here... }

и измените getPackageManager()... на parent.getPackageManager()...

в вашем основном действии, создайте объект getApps, а затем вызовите его, чтобы получить информацию:

getApps appsGetter = new getApps(this); // "this" is your activity actually,which extends Context
String info = appsGetter.getinfo();

теперь вам все равно нужно реализовать getInfo(), но это не должно быть так сложно. и еще одна вещь, классы в Java начинаются с заглавной буквы, поэтому вместо getApps следует назвать ее getApps или AppsGetter.

  • 0
    Не могли бы вы дать небольшой пример кода, как расширить контекст, пожалуйста?
  • 0
    @ Найл, да, но во-первых, у вас есть основной вид деятельности в вашем приложении (вы должны иметь ...)?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню