2011-08-17 68 views
7

我需要自己編寫一些util類,我需要android應用程序的包名。 雖然我發現了packageManager,它只能用在有上下文的Activity等等。我只想在我的類中獲取將在android應用中使用的packagename。那我該怎麼做?謝謝!如何在android中獲取包名?

+0

您是否需要安裝所有應用程序的包名? – Rasel

+0

你不需要! – Guillaume

回答

32

用途:getPackageManager().getPackageInfo(getPackageName(), 0).packageName 或者只是MyContext.getPackageName()

您也可以創建一個函數:

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

謝謝,也許我沒有描述清楚,這是一個普通的類,所以它沒有Context.The類將打包在一個用於android應用程序的jar。所以我無法獲得它的方法。 – user898366

+2

所以創建一個這樣的函數: 'MyFunction(Context MyContext){ MyContext.getPackageName() }' – Guillaume

4

你可以安裝應用的應用包名稱:

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

,如果你想找到你的應用程序的軟件包名稱:

context.getPackageName(); 
+0

謝謝,也許我沒有描述清楚,這是一個普通的類,所以它沒有Context.The類將打包在一個用於Android應用程序的jar。所以我不能得到它的方法。謝謝你們都是,但你們所有的答案都是一樣的。 – 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

謝謝,也許我沒有描述清楚,這是一個普通的類,所以它沒有Context.The類將打包在一個用於Android應用程序的jar。所以我不能得到它的方法。謝謝你們都是,但你們所有的答案都是一樣的。 – user898366

+0

然後你可以發送一個參考的上下文,並可以使用這種方式 – Rasel

+0

好吧,我想我必須讀取外面的靜態數據。 – user898366

0

您可以創建一個實用程序類是這樣的:

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

那麼你可以使用這種方式

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

那麼你可以這樣調用它:

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

getApplicationContext().getPackageName()會給包年齡的名字。

+0

不,不要使用這個。 – Sakiboy

+0

爲什麼?如果您被要求某人不要使用它,請始終給出原因。我也不知道你爲什麼不要使用它。 –

+0

這將檢索錯誤的軟件包名稱。看到我的答案總是得到正確的'java'包名稱。你的答案可以通過gradle進行修改,從而產生「不準確」的包名稱(即,它會說調試,發佈,或者你設置的任何構建風格) – Sakiboy

1

我已經看到了以下兩種方式來獲得包名稱,從上下文變量開始:

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

context.getPackageName() 

會不會他們總是給出相同的答案?在某些情況下,最好使用另一種方法嗎?

12

以下常量可用,無需上下文。

BuildConfig.APPLICATION_ID 
0

我認爲getPackageName()可以在活動內直接使用,不需要致電getApplicationContext。檢查它自己。工作很好。

0

將此添加到您的util類中。它確保處理不同的「風味」和調試/發佈版本,因爲其他答案不會:

@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; 
    } 
} 
相關問題