【问题标题】:external-internal storage外部-内部存储
【发布时间】:2012-06-26 17:02:17
【问题描述】:

在android中,不可移动的外部存储(内部)和内部存储有什么区别?我不确定在哪里保存我的数据。我只需要保存人们可以随时拉取的游戏统计数据

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    在许多较新的设备中将不再有物理区别,“内部”和“外部”存储共享相同的闪存芯片,甚至不一定具有固定分配,因此差异实际上仍然是预期访问范式之一。

    外部存储上的文件(真实的或模拟的)不可避免地会与所有东西共享,并且可以被任何具有该清单权限的东西修改。传统上它们很容易被看到,但对于最近的 MTP 访问设备,系统可能需要在连接的 PC 看到它们之前被告知它们。

    相反,内部存储上的文件对于应用程序来说是私有的,但以 root 或系统运行的任何文件除外,或者如果应用程序决定让它们通常可见或可更改。即使可以访问,内部存储上的数据也可能更难以在拥有的应用程序之外访问 - 它不受面向消费者的 USB 大容量存储或 MTP 机制的支持,即使对于其他应用程序和开发工具,也很难找到它,除非您知道在哪里查看,因为虽然您可以检查应用程序选择共享的文件夹,但您无法浏览父文件夹(通常是 /data 或 /data/app)。即使对于应用程序的开发人员来说,在调试期间访问它在私有存储上创建的文件也可能有点令人沮丧(尽管 apk 是可调试的,但可以使用 run-as 工具和 adb 进行调试,或者您可以构建导出功能进入应用程序,或在 adb 有 root 的模拟器上运行)。

    您的决策过程可能应该是这样的:它是否意味着对拥有的应用程序是私有的?如果是这样,请将其放在内部存储设备上,除非它太大且针对旧设备,在这种情况下,您可能需要在放置外部存储设备之前对其进行加密和/或签名以进行保护。否则,如果要共享,需要交给任意其他组件(电子邮件应用程序等),或者很大,请将其放在外部存储上。

    【讨论】:

    • 完美。谢谢你的详细回答。我假设每个设备都有一个外部存储,对吗?我的意思是我不需要担心没有外部存储和我的保存机制失败
    • 不,您不能假设每个设备都有一个外部存储。每台装有 Android Market 的设备最初都应该有一个,但一个可移动的 sdcard 可能会被移除或丢失,而其他设备可能不会附带一个。更重要的是,在具有 USB 大容量存储模式的设备上,当 PC 挂载外部存储时,应用程序将无法访问外部存储。这并不意味着您必须在没有外部存储的情况下进行操作,而是您应该以一种信息丰富的方式向用户抱怨,而不仅仅是失败。例如,浏览器将拒绝下载没有任何内容。
    • 如果有两种形式的外部存储(内置和可移动)呢?如果可证明类型不存在并且您在内置类型上有音乐和文件,那么当您插入可证明类型时会发生什么?您会无法访问内置外部存储中的内容吗?
    • 这最终取决于制造商如何实现可移动存储,但是如果插入它以禁用对固定外部存储的访问,那将是一个非常不幸的设计,而且我不知道有任何设备在其中发生。 (一个例外是自定义 ROM,它可能有一个高级菜单,用户可以在其中自定义挂载点)。任何形式的“外部”存储(固定或可移动)和“内部”存储之间都不应存在干扰。
    【解决方案2】:

    在android中,不可移动的外部存储(内部)和内部存储有什么区别?

    外部存储绝不意味着可移动。它始终意味着“用户可以通过插入 USB 电缆并将其作为驱动器安装在主机上来访问”。早期的 Android 设备碰巧具有可移动的外部存储,但这从来不是定义。

    内部存储是用户无法访问的存储,除非通过已安装的应用程序(或通过 root 设备)。

    【讨论】:

    • 或者在应用程序允许的文件设置范围内,通过 ADB。
    【解决方案3】:

    对于 Chris 的回答,如果您担心外部存储(SD 卡)不可用,您可以在每次应用加载时简单地检查一下,然后相应地提取相关信息。

    你可以这样使用:

    if(isSDPresent)
    {
        // SD Card is present
        // Your code goes here, files will be located @ /mnt/sdcard/Android/data/packagename
    }
    else
    {
        // SD Card is not presenet
        // files located here /data/data/packagename
    }
    

    如果您在模拟器上进行测试,您可以加载您的 DDMS 并找到存储在 revlent 位置的所有文件。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2012-02-07
      • 2023-03-05
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多