【问题标题】:Get Application Directory获取应用程序目录
【发布时间】:2011-07-28 12:26:44
【问题描述】:

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

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

澄清: 首先 - 感谢您的回复。我试图了解是否已经存在可以做到这一点的方法,而不是另一种解决方法。

【问题讨论】:

  • @MByD:出于好奇,您具体想做什么?您应该不需要该目录。例如,如果要使用数据库目录,请使用getDatabasePath()。或者,如果您希望自己的目录独立于其他任何内容,请使用 getDir()
  • @CommonsWare - 我有一个不受我控制的共享对象,它在我的包文件夹下创建了几个文件夹,我需要访问它们。我只是想知道为什么某些方法不能使用基本文件夹。
  • @MyByD:告诉写共享对象的人检查他们的头部。
  • @CommonsWare - 这有什么问题?另外,我的父母叫我 MByD 是有原因的,请不要叫我 MyByD ;)
  • @MByD:对不起,名字打错了。关于共享对象,如果他们希望您直接操作这些文件,那么他们至少需要为您提供获取这些目录的方法或其他东西,而不是您必须破解自己的解决方案。相反,如果他们希望您直接操作这些文件,那么他们需要一些 API 来让您通过他们的代码执行需要执行的操作。如果您尝试做的事情远远超出了共享对象的范围,那么您可能不应该尝试访问这些文件。

标签: android directory


【解决方案1】:

有一种更简单的方法可以使用 min API 4+ 获取应用程序数据目录。从任何上下文(例如活动、应用程序):

getApplicationInfo().dataDir

http://developer.android.com/reference/android/content/Context.html#getApplicationInfo()

【讨论】:

    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 虽然我使用了不同的解决方案,但我发现你的解决方案真的很“干净”
    • 这将为您提供 APK 路径,sourceDir 是一个不幸的错误命名。 dataDir 应该是你要找的。​​span>
    • 它返回应用程序的目录,这就是问题所要求的。在投反对票之前尝试正确阅读问题。
    • 我试过这个实现,eclipse告诉我有一个未捕获的异常:未处理的异常类型PackageManager.NameNotFoundException
    • 在下面查看我的答案,这是一个简单的单行。
    【解决方案3】:

    只需在您的代码中使用它

     context.getApplicationInfo().dataDir
    

    【讨论】:

    • 在 Android 5.1 上运行良好,谢谢!很好很简单。
    • 这和打电话android.os.Environment.getDataDirectory().getAbsolutePath()一样吗?
    【解决方案4】:

    我收到了

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

    from here

    【讨论】:

    • getFilesDir 返回 dataDir 的子目录
    • 请花时间阅读您正在回答的问题。 getFilesDir() 机制已经在问题本身的文本中提出并被拒绝为不可取的。此外,正如 njzk2 所指出的,除非您按照问题中所做的那样获取其父目录,否则它不会返回所需的结果。
    【解决方案5】:

    对于当前的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;
    }
    

    【讨论】:

    • 我能找到一个类在包内吗?
    【解决方案6】:

    如果您尝试访问文件,请尝试here 所述的openFileOutput()openFileInput() 方法。它们会自动打开内部存储器中指定文件的输入/输出流。这允许您完全绕过目录和 File 对象,这是一个非常干净的解决方案。

    【讨论】:

    • 谢谢,但实际上我只是想了解是否有一个函数可以返回我的应用程序目录路径,我经常使用它,而我目前的解决方案对我来说看起来很丑。跨度>
    • @MByd,啊。我明白了,对不起,这不是你要找的!
    • @MByD:当你说“我经常使用它”时,你是什么意思?你在代码的很多地方都这样做???
    • @MisterSquank - 是的。好像要转到 util 类了,但还是……
    • 与 getFilesDir() 方法一样,这不会访问所需的路径,而是访问其中的子目录。
    【解决方案7】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2015-01-23
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2011-06-11
      • 2011-03-28
      相关资源
      最近更新 更多