2011-04-03 69 views
60

有人知道如何獲取我的應用程序目錄的路徑嗎? (例如/data/data/my.app.lication/獲取應用程序目錄

目前我正在使用這種方法:myActivity.getFilesDir().getParent();但在我看來,如果有更簡單的解決方案,它就像是一種解決方法。另外,副作用是創建不需要的files目錄。

澄清:首先 - 謝謝你的回報。我嘗試瞭解是否已經存在這樣做的方法,而不是用於其他解決方法。

+0

@MByD:出於好奇,具體是什麼,你想幹什麼?你應該不需要該目錄。例如,如果你想使用數據庫目錄,使用'getDatabasePath()'。或者,如果您希望自己的目錄獨立於其他任何目錄,請使用'getDir()'。 – CommonsWare 2011-04-03 11:56:24

+0

@CommonsWare - 我有一個不在我的控制下的共享對象,它在我的包文件夾下創建了幾個文件夾,我需要訪問它們。我只是想知道爲什麼不是某種方法可用的基礎文件夾。 – MByD 2011-04-03 12:06:23

+1

@MyByD:告訴誰寫了共享對象頭部檢查。 – CommonsWare 2011-04-03 12:51:56

回答

76
PackageManager m = getPackageManager(); 
String s = getPackageName(); 
PackageInfo p = m.getPackageInfo(s, 0); 
s = p.applicationInfo.dataDir; 

如果關於未捕獲NameNotFoundException蝕擔心,你可以使用:

PackageManager m = getPackageManager(); 
String s = getPackageName(); 
try { 
    PackageInfo p = m.getPackageInfo(s, 0); 
    s = p.applicationInfo.dataDir; 
} catch (PackageManager.NameNotFoundException e) { 
    Log.w("yourtag", "Error Package name not found ", e); 
} 
+2

雖然我使用不同的解決方案,但我發現你的確很「乾淨」 – MByD 2011-04-29 17:17:22

+2

這會讓你獲得APK路徑,'sourceDir'是一個不幸的錯誤。 'dataDir'應該是你要找的。 – orip 2011-11-01 12:27:24

+2

它返回應用程序的目錄,這是問題的要求。在投票人之前,請嘗試正確地閱讀問題。 – 2012-02-14 17:04:15

2

如果您嘗試訪問文件,請嘗試使用描述爲hereopenFileOutput()openFileInput()方法。它們會自動打開輸入/輸出流到內存中的指定文件。這允許你完全繞過目錄和File對象,這是一個非常乾淨的解決方案。

+0

謝謝,但實際上我只是想了解是否有一個函數返回我的應用程序目錄路徑,我使用它很多,我目前的解決方案看起來很醜。 – MByD 2011-04-03 05:31:03

+0

@MByd啊。我很抱歉,這不是你要找的東西! – 2011-04-03 05:36:15

+0

謝謝:) – MByD 2011-04-03 05:39:11

15

我得到這個

String appPath = App.getApp().getApplicationContext().getFilesDir().getAbsolutePath(); 

from here

+1

getFilesDir返回dataDir的子目錄 – njzk2 2013-08-22 13:48:23

+7

請花時間閱讀您正在回答的問題。 getFilesDir()機制已經被提出,並在問題本身中被拒絕爲不可取的。另外,正如njzk2所指出的那樣,除非你拿到它的父目錄,否則它不會返回所需的結果,就像問題中所做的那樣。 – 2014-03-07 21:08:17

5

對於目前Android應用程序包:

public String getDataDir(final Context context) throws Exception { 
    return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).applicationInfo.dataDir; 
} 

對於任何包:

public String getAnyDataDir(final Context context, final String packageName) throws Exception { 
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir; 
} 
2

基於@賈裏德-洞穴溶液。對於任何包,但通過上下文作爲參數...

public static String getDataDir(Context context) throws Exception { 
    return context.getPackageManager() 
      .getPackageInfo(context.getPackageName(), 0) 
      .applicationInfo.dataDir; 
} 
10

只需使用此代碼中的

context.getApplicationInfo().dataDir 
+0

在Android 5.1上很棒,謝謝!很好很簡單。 – 2017-11-09 03:27:03

相關問題