434 votes

Comment obtenir le nom du paquet de n'importe où?

Je suis au courant de la disponibilité de Contexte.getcontexteapplication() et Afficher.getContext(), à travers lequel je peux vraiment appeler Contexte.getPackageName() pour récupérer le nom du package de l'application.

Ils travaillent si je peux appeler une méthode à laquelle un View ou Activity objet est disponible, mais si je veux trouver le nom du package de manière totalement indépendante de la classe sans View ou Activity, est-il un moyen de le faire (directement ou indirectement)?

572voto

John Leehey Points 10405

Une idée est d'avoir une variable statique dans votre activité principale, instanciée pour être le nom du package. Alors juste référence à cette variable.

Vous devrez l'initialiser dans la méthode onCreate() l'activité principale:

Global à la classe:

 public static String PACKAGE_NAME;
 

Alors..

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PACKAGE_NAME = getApplicationContext().getPackageName();
}
 

Vous pouvez alors y accéder via Main.PACKAGE_NAME .

376voto

Billda Points 352

J'ai récemment découvert cette classe magique

 BuildConfig 
et il a toutes sortes de constantes liées à la construction, par exemple PACKAGE_NAME. Donc, je dirais que c'est la solution parfaite à ce problème.

Edit: PACKAGE_NAME est maintenant obsolète, APPLICATION_ID doit être utilisé

71voto

Addev Points 4755

Si avec le mot "nulle part" vous voulez dire sans avoir explicitement Context (par exemple à partir d'un thread d'arrière-plan), vous devez définir une classe dans votre projet comme:

 public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}
 

Ensuite , dans votre manifest vous devez ajouter cette classe à Name champ au Application onglet. Ou éditer le xml et mettre

 <application
    android:name="com.example.app.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    .......
    <activity
        ......
 

et puis de n'importe où vous pouvez appeler

 String packagename= MyApp.getContext().getPackageName();
 

J'espère que cela aide.

46voto

Mahendra Points 2298

Utilisez ceci: BuildConfig.class.getPackage().getName() pour obtenir le nom du package de l'application.

0voto

NameSpace Points 2626

Voici une réponse tardive.

Le haut de réponse à cette question a certains pièges évidents. Il dépend à la fois une instance de la classe englobante et ses onCreate être appelée avant d'accéder n'importe où. Parce qu'il n'a pas de manière statique de l'initialisation de lui-même, certains autres affiches ont noté qu'elle peut aussi revenir à nul de nouveau.

Vous pouvez essayer ce qui suit:

static public final String PACKAGE_NAME = ClassName.class.getPackage().getName();

"ClassName" est arbitraire, les classes contenues dans le paquet qui est le nom que vous interrogez. Vous pouvez utiliser la classe englobante. Contrairement à "cela", il fonctionne même si il n'y a pas encore de toutes les instances de la classe elle-même. La "classe" de référence est un singleton, et n'est jamais null autant que je sache.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X