【问题标题】:Android file storage options / conventionsAndroid 文件存储选项/约定
【发布时间】:2011-12-08 19:05:36
【问题描述】:

所以我正在制作这个 android 应用程序,它需要从用户提供的 CSV 文件中读取数据。

CSV 文件在台式计算机上更舒适地编辑,所以我在应用程序中没有编辑器,它是“只读”的;我假设手机的 SD 卡上有一个文件。

Data Storage documentation 之后,我设法编写了一个从外部存储读取文件的哑版本,硬编码相对于 getExternalStorageDirectory 返回的文件夹位置。所以目前我有:

 private static final String CSV_FILE = "/Android/foo/bar.csv"
 ...
 File f = new File(Environment.getExternalStorageDirectory(), CSV_FILE);

然后我将我的手机连接到 PC,在“/Android”文件夹(存在于我的手机上)中创建一个“foo”文件夹,复制“bar.csv”文件,一切正常。

现在显然,如果我想分发应用程序,这是不可接受的。所以我有几个问题:

  • 自然的解决方案是对文件位置进行软编码,在任何其他系统中,我将依赖内置的“文件管理器”或其他东西,让用户浏览到正确的文件。 令人惊讶的是我找不到这样的控件,并且似乎有很多第三方文件浏览器应用程序。这是否意味着要求用户在手机上选择文件不是“习惯”?我应该编写自己的“文件浏览器”吗?

  • 关于我应该如何命名我的“foo”目录是否有约定?我已经看到应用程序使用看起来像 java 包的名称创建目录,我是否将其误认为是内部存储?

  • 还有一个 getExternalStoragePublicDirectory 方法,它采用“目录类型”常量。在我的情况下,假设文件在 DIRECTORY_DOWNLOADS 中是否“有意义”?(或在 DIRECTORY_DOWNLOADS 的某个子文件夹中?)

  • 我应该担心 lambda 用户如何将文件放在他们的手机上吗?对我来说,在我的电脑上插上电话很简单,但在所有机器人上真的很容易吗?

对不起,如果所有这些听起来微不足道,只是想在做一些愚蠢的事情之前让我清醒一下。

谢谢。

【问题讨论】:

    标签: android filesystems


    【解决方案1】:

    这是否意味着要求用户在手机上选择文件不是“习惯”?

    正确。 Android 和 iOS 一样,会尽量远离“文件”。

    我应该编写自己的“文件浏览器”吗?

    当然有很多第三方的文件浏览应用程序,其中一些支持ACTION_PICK或类似的操作(例如,OI文件管理器)。如果没有人为此编写可重用组件,我会感到惊讶。

    关于我应该如何命名我的“foo”目录是否有约定?我已经看到应用程序创建的目录名称看起来像一个 java 包,我把它误认为是内部存储吗?

    不,您可能会看到getExternalFilesDir() 的结果。如果您只支持 API Level 8 或更高版本,我会使用它。如果您支持较早版本的 Android,您可能会考虑为您的应用找到合适的目录,该目录将通过 getExternalFilesDir() 使用,然后“手动”将其用于较早的 Android 版本。

    还有一个 getExternalStoragePublicDirectory 方法采用“目录类型”常量。在我的情况下,假设文件在 DIRECTORY_DOWNLOADS 中是否“有意义”?(或在 DIRECTORY_DOWNLOADS 的某个子文件夹中?)

    这适用于下载 - 更准确地说,是用户下载的内容,他们希望独立于任何已安装的应用程序来保存这些内容。听起来这不适合您的情况。

    我应该担心 lambda 用户如何将文件放在他们的手机上吗?

    什么是“lambda 用户”?引用吟游诗人的话,“但是,就我自己而言,这对我来说是希腊语”:-)

    对我来说,在我的 PC 上插入电话很简单,但在所有机器人上真的很容易吗?

    在 Android 3.x 及更高版本上会更痛苦,因为 Android 从 USB 大容量存储模式(想想 USB 拇指驱动器)转移到 MTP(想想 MP3 播放器)的 USB 文件传输协议。虽然这具有整体优势,但对于 OS X 和 Linux 用户来说却很烦人,因为它们都没有内置的 MTP 支持。此外,它假设用户手边有一根 USB 电缆。您的整体设置还假设用户手边有桌面操作系统。

    如今,更多的开发人员可能会选择创建 Web 应用程序而不是桌面应用程序,并通过 Internet 将数据同步到设备。这消除了对电缆大惊小怪的需要,并且不会将用户束缚在一台特定的“桌面”机器上进行数据输入。但是,它确实需要访问 Internet,这可能适合也可能不适合您的情况。

    【讨论】:

    • 谢谢!对于“希腊语”,“lambda 用户”可能是法语表达的可怕翻译(我们说“un utilisateur lambda”来表示“你的普通用户”。现在“你的普通用户”没有任何意义,因为没有人是“平均”,但我想到的是拥有电话、PC 和电缆但不一定知道如何连接所有设备的典型用户。
    • 这仍然让我没有“好的”解决方案,因为为此设置一个网络应用程序看起来真的有点矫枉过正。出于好奇,在我的添加中嵌入编辑器并将所有内容存储在 sqli 数据库中是否更有意义?
    • @phtrivier:“将编辑器嵌入到我的添加中,并将所有内容存储在 sqli db 中更有意义吗?” -- 除非数据几乎不可能在设备上输入,否则我至少会有一个应用内编辑器作为选项。毕竟,有些人的平板电脑或设备带有物理键盘或其他使数据输入更容易的东西。 “为此设置一个 web 应用程序真的看起来有点矫枉过正”——而创建一个桌面应用程序不是吗?如果您打算让他们通过电子表格输入 CSV,请考虑 Google Docs 集成或类似 Web 的东西。
    • 是的,我正计划让他们用 excel 或其他方式编辑 CSV。数据不是不可能在手机上输入的,但这会很乏味(而且我的应用在平板电脑上没有任何意义。)从来没有想过谷歌文档集成,你有什么好处吗起点?再次感谢。
    • @phtrivier:我自己还没有完成 Google Docs 集成。我知道有一个 API,但仅此而已。对不起。
    猜你喜欢
    • 2016-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多