2011-08-17 12 views
7

Muszę napisać trochę klasy util przez siebie i potrzebuję nazwy pakietu aplikacji na Androida. Podczas znajdowania menedżera pakietów, który może być używany tylko w działaniu i tak ma kontekst. Chcę tylko uzyskać nazwę pakietu w mojej klasie, która będzie używana w aplikacji na Androida. Jak mogę to zrobić? Dziękuję Ci!Jak mogę uzyskać nazwę pakietu w systemie Android?

+0

Czy potrzebujesz całej nazwy zainstalowanego pakietu aplikacji? – Rasel

+0

Nie potrzebujesz! – Guillaume

Odpowiedz

32

Zastosowanie: getPackageManager().getPackageInfo(getPackageName(), 0).packageName lub po prostu MyContext.getPackageName()

Można również utworzyć funkcję :

public String getPackageName(Context context) { 
    return context.getPackageName(); 
} 
+0

dziękuję, może nie opisałem tego jasno, to zwykła klasa, więc nie ma kontekstu. Klasa zostanie spakowana w słoiku, który jest używany w aplikacji na Androida. Więc nie mogę uzyskać metody, aby do niego dotrzeć. – user898366

+2

Stwórz więc taką funkcję: 'MyFunction (Kontekst MyContext) { MyContext.getPackageName() }' – Guillaume

4

można uzyskać nazwę pakietu zainstalowanych aplikacji:

ArrayList<PackageInfo> res = new ArrayList<PackageInfo>(); 
     PackageManager pm = getApplicationContext().getPackageManager(); 
     List<PackageInfo> packs = pm.getInstalledPackages(0); 

a jeśli chcesz, aby znaleźć nazwę pakietu aplikacji:

context.getPackageName(); 
+0

dziękuję, może nie opisałem jasno, To zwykła klasa, więc nie ma Kontekstu. Klasa zostanie spakowana w słoiku, który jest używany w aplikacji na Androida. Więc nie mogę uzyskać metody, aby do niego dotrzeć. wszyscy, ale cała twoja odpowiedź jest taka sama. – user898366

1
List<ApplicationInfo> packages; 
    PackageManager pm; 
    pm = getPackageManager(); 
      get a list of installed apps. 
      packages = pm.getInstalledApplications(0); 

ActivityManager mActivityManager = (ActivityManager) context 
       .getSystemService(Context.ACTIVITY_SERVICE); 

    for (ApplicationInfo packageInfo : packages) { 
    //packageInfo.packageName contains package name 


         } 
+0

dziękuję, może nie opisałem wyraźnie, To zwykła klasa, więc nie ma Kontekstu. Klasa zostanie spakowana w słoiku, który był używany w aplikacji na Androida. Więc nie mogę uzyskać metody, aby do niego dotrzeć.dziękuję wszyscy, ale cała twoja odpowiedź jest taka sama. – user898366

+0

następnie można wysłać odwołanie do kontekstu i można tego użyć w ten sposób – Rasel

+0

OK, myślę, że muszę odczytać dane statyczne na zewnątrz. – user898366

0

można utworzyć klasę Util w ten sposób:

public class AppInfo{ 
    private static Context cxt; 
    public static String PACKAGE_INFO; 
    public static String init(Context context){ 
    cxt = context; 
    PACKAGE_INFO = cxt.getPackageName(); 
    } 
} 

wtedy można go używać w ten sposób

public class MyActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle bundle){ 
    ... 
    AppInfo.init(getApplicationContext()); 
    ... 
    } 
} 

następnie można nazwać to w ten sposób:

public class someClass{ 
    public void someMethod(){ 
    String packageInfo = AppInfo.PACKAGE_INFO; 
    //Do what you wish 
    } 
} 
2

getApplicationContext().getPackageName() poda opakowanie imię i nazwisko.

+0

nie, nie używaj tego. – Sakiboy

+0

dlaczego? Zawsze podawaj powód, jeśli zostaniesz poproszony o nieużywanie go. Nie wiem też, dlaczego prosiłeś, aby tego nie używać. –

+0

Spowoduje to pobranie niewłaściwej nazwy pakietu. Zobacz moją odpowiedź poniżej, aby zawsze uzyskać poprawną nazwę pakietu 'java'. Twoja odpowiedź może być modyfikowana przez gradle, tworząc w ten sposób "niedokładne" nazwy paczek (to znaczy, że debugowanie, wydanie lub jakikolwiek smak kompilacji, który ustawiłeś) – Sakiboy

1

Widziałem następujące dwa sposoby, aby uzyskać nazwę pakietu zaczynające się od zmiennej Context:

context.getPackageManager().getPackageInfo(context.getPackageName(), 0).packageName 

i

context.getPackageName() 

nie zawsze będą dawać taką samą odpowiedź? Czy w pewnych okolicznościach preferuje się jeden sposób nad drugim?

12

Następująca stała jest dostępna bez potrzeby kontekstu.

BuildConfig.APPLICATION_ID 
0

myślę getPackageName() jest dostępny bezpośrednio w zasięgu działania bez wywoływania getApplicationContext. Sprawdziłem to sam. Dobra praca.

0

Tutaj dodaj to do swojej klasy util. Zapewnia obsługę różnych "smaków" i kompilacji debugowania/wydania, ponieważ inne odpowiedzi nie:

@Nullable 
public static String getApplicationPackageName(@NonNull Context context) 
{ 
    final PackageInfo packageInfo = getPackageInfo(context); 
    if (packageInfo.applicationInfo == null) 
    { 
     return null; 
    } 
    // Returns the correct “java” package name that was defined in your 
    // AndroidManifest.xml. 
    return packageInfo.applicationInfo.packageName; 
} 

// Convenience method for getting the applications package info. 
@NonNull 
private static PackageInfo getPackageInfo(@NonNull final Context context) 
{ 
    final PackageManager packageManager = context.getPackageManager(); 

    try 
    { 
     return packageManager.getPackageInfo(context.getPackageName(), 0); 
    } 
    catch (final PackageManager.NameNotFoundException ignored) 
    { 
     //noinspection ConstantConditions: packageInfo should always be available for the embedding app. 
     return null; 
    } 
} 
Powiązane problemy