2011-08-17 15 views
7

Necesito escribir algunas clases de utilidades por mi cuenta y necesito el nombre del paquete de la aplicación de Android. Mientras encontré el packageManager que solo se puede usar en Activity y demás, tiene contexto. Solo quiero obtener el nombre del paquete en mi clase, que se usará en la aplicación de Android. Entonces, ¿cómo puedo hacer esto? ¡Gracias!¿Cómo puedo obtener el nombre del paquete en android?

+0

¿necesita el nombre del paquete de la aplicación instalada? – Rasel

+0

¡No es necesario! – Guillaume

Respuesta

32

Uso: getPackageManager().getPackageInfo(getPackageName(), 0).packageName O simplemente MyContext.getPackageName()

También puede crear una función :

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

gracias, tal vez no describí claramente, es una clase ordinaria, por lo que no tiene Contexto. La clase se empacará en un contenedor que se utilizó en la aplicación de Android. Por lo tanto, no puedo obtener el método para llegar a ella. – user898366

+2

Entonces crea una función como esa: 'MyFunction (Context MyContext) { MyContext.getPackageName() }' – Guillaume

4

se puede obtener el nombre del paquete de la aplicación instalada:

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

y si usted quiere encontrar el nombre del paquete de la aplicación:

context.getPackageName(); 
+0

gracias, tal vez no describí claramente, es una clase ordinaria, por lo que no tiene Contexto. La clase se empacará en un contenedor que se utilizó en la aplicación de Android. Por lo tanto, no puedo obtener el método para alcanzarlo. Gracias todos ustedes, pero toda su respuesta es la misma. – 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

gracias, tal vez no describí claramente, es una clase normal, por lo que no tiene Contexto. La clase se empacará en un contenedor que se utilizó en la aplicación de Android. Por lo tanto, no puedo obtener el método para llegar a ella. Gracias todos ustedes, pero toda su respuesta es la misma. – user898366

+0

entonces puede enviar una referencia al contexto y puede usarlo de esta manera – Rasel

+0

OK, creo que debo leer los datos estáticos afuera. – user898366

0

puede crear una clase Util esta manera:

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

entonces usted puede usarlo de esta manera

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

entonces se le puede llamar de esta manera:

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

getApplicationContext().getPackageName() dará el paquete nombre de edad

+0

no, no uses esto. – Sakiboy

+0

¿por qué? Siempre dé la razón si le piden a alguien que no la use. Tampoco sé por qué pidió no usar esto. –

+0

Esto recuperará el nombre del paquete incorrecto. Vea mi respuesta a continuación para obtener siempre el nombre correcto del paquete 'java'. Su respuesta puede ser modificada por gradle produciendo así nombres de paquetes "imprecisos" (es decir, se aplicará la depuración, versión o cualquier versión de compilación que haya configurado) – Sakiboy

1

he visto las dos formas siguientes para obtener el nombre del paquete a partir de una variable de contexto:

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

y

context.getPackageName() 

¿No será que siempre dan la misma respuesta? ¿Es preferible usar una forma sobre la otra en ciertas circunstancias?

12

La siguiente constante está disponible sin necesidad de un contexto.

BuildConfig.APPLICATION_ID 
0

creo getPackageName() está disponible directamente en la actividad sin llamar getApplicationContext. Lo revisé yo mismo. Trabajando bien.

0

Agregue esto a su clase de utilidades. Se asegura de manejar diferentes "sabores" y versiones de depuración/liberación, como otras respuestas no:

@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; 
    } 
} 
Cuestiones relacionadas