获取应用程序目录


80

有人知道如何获取应用程序目录的路径吗?(例如/data/data/my.app.lication/

当前,我正在使用这种方法:myActivity.getFilesDir().getParent();但是在我看来,有一个更简单的解决方案时,这是一种解决方法。同样,副作用是files目录的创建,这是不必要的。

澄清:首先-感谢您的答复。我尝试了解是否已经存在执行此操作的方法,而不是其他解决方法。


@MByD:出于好奇,您要具体做什么?您应该不需要该目录。例如,如果要使用数据库目录,请使用getDatabasePath()。或者,如果您希望自己的目录独立于其他任何东西,请使用getDir()
CommonsWare,

@CommonsWare-我有一个不受我控制的共享对象,该共享对象在我的package文件夹下创建了几个文件夹,我需要访问它们。我只是想知道为什么某些方法无法使用基本文件夹。
MByD 2011年

1
@MyByD:告诉编写该共享库的任何人都要检查他们的头部。
CommonsWare,

1
@CommonsWare-这有什么问题?另外,我的父母叫我MByD是有原因的,请不要叫我MyByD;)
MByD 2011年

2
@MByD:很抱歉输入错误。关于共享库,如果他们希望您直接操作这些文件,则至少他们需要为您提供方法或某些东西来获取这些目录,而不是您必须破解自己的解决方案。相反,如果他们希望您直接操作这些文件,那么他们需要一些API来让您通过他们的代码来完成所需的工作。如果您要执行的操作超出了共享库的范围,那么您可能不应该尝试访问文件。
CommonsWare,

Answers:


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

如果eclipse担心未解决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);
}

3
尽管我使用了不同的解决方案,但我发现您的解决方案确实“干净”
MByD 2011年

2
这会让您进入APK路径,这sourceDir是一个不幸的错误命名。dataDir应该是您要寻找的。
2011年

2
它返回应用程序的目录,这就是问题的所在。在您投票否决他人之前,请尝试正确阅读问题。
菲利普·谢德

我尝试了此实现,日食告诉我有一个未捕获的异常:未处理的异常类型PackageManager.NameNotFoundException
m-ric

请参阅下面的我的答案,这是一个简单的班轮。
詹姆斯·沃尔德


20

我懂了

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

从这里


2
getFilesDir返回dataDir的
子目录

9
请花时间阅读您要回答的问题。已经提出了getFilesDir()机制,并在问题本身的文本中将其视为不受欢迎的机制。另外,如njzk2所指出的,除非您按照问题中的说明进行操作,否则除非返回父目录,否则它不会返回所需结果。
克里斯·斯特拉顿

19

只需在您的代码中使用它

 context.getApplicationInfo().dataDir

在Android 5.1上运行良好,谢谢!漂亮又简单。
约书亚·品特

这和打电话一样android.os.Environment.getDataDirectory().getAbsolutePath()吗?
皮埃尔·

10

对于当前的Android应用程序包:

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

对于任何包装:

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

我可以发现类是否在包中吗?
Sunil Chaudhary

3

如果你想获得对文件的访问,请尝试openFileOutput()openFileInput()所描述的方法在这里。它们自动将输入/输出流打开到内部存储器中的指定文件。这使您可以File完全绕开目录和对象,这是一个非常干净的解决方案。


谢谢,但是实际上我只是想了解是否有一个函数返回我的应用程序目录路径,因此我经常使用它,而当前的解决方案对我来说看起来很丑。
MByD 2011年

@MByd,嗯。我很抱歉,这不是您想要的东西!
克里斯·汤普森

@MByD:当您说“我经常使用”时,您是什么意思?您在代码中的很多地方都这样做了???
Squonk 2011年

@MisterSquank-是的。看来它将转移到util类,但仍然...
MByD 2011年

与getFilesDir()方法一样,它不会访问所需的路径,而是访问其中的子目录。
克里斯·斯特拉顿

3

基于@ jared-burrows的解决方案。对于任何包,但将Context作为参数传递...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.