Android 外部存储与 SD 卡

2023-12-30

阅读有关存储文件的 Android 文档后,我发现外部存储可以包括可移动 SD 卡和设备内部存储(即不可移动)。选择将文件保存到外部存储时,是否可以区分可移动存储和不可移动存储?


我认为您无法可靠地区分内部和外部(SD)存储。

乍一看,您似乎可以使用类似的东西Environment.isExternalStorageRemovable()但这并不可靠,因为您的“主要外部”存储设备很可能是设备的内部存储器,而不是 SD 卡。

该文档用于Environment.getExternalStorageDirectory() http://developer.android.com/reference/android/os/Environment.html states:

注意:不要对这里的“外部”一词感到困惑。该目录可以更好地被视为媒体/共享存储。它是一个可以容纳相对大量数据并且在所有应用程序之间共享的文件系统(不强制执行权限)。传统上,这是一张 SD 卡,但它也可以实现为设备中的内置存储,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。

举个例子,我的 LG G4 安装了一个外部 SD 卡,我可以使用 adb 看到它(external_SD):

$ adb shell ls -la /storage/
drwx------ root     root              2015-02-28 01:10 USBstorage1
drwx------ root     root              2015-02-28 01:10 USBstorage2
drwx------ root     root              2015-02-28 01:10 USBstorage3
drwx------ root     root              2015-02-28 01:10 USBstorage4
drwx------ root     root              2015-02-28 01:10 USBstorage5
drwx------ root     root              2015-02-28 01:10 USBstorage6
dr-xr-xr-x root     root              2015-02-28 01:10 emulated
drwxrwx--x root     sdcard_r          2015-07-31 08:19 external_SD
lrwxrwxrwx root     root              2015-02-28 01:10 sdcard0 -> /storage/emulated/legacy

但是,外部存储的各种 API 返回的值证明设备正在使用内部存储器作为其“主要外部”存储:

  • 环境.getExternalStorageState:mounted
  • 环境.isExternalStorageEmulated:true
  • Environment.isExternalStorageRemovable:false
  • Context.getExternalCacheDir:/存储/emulated/0/Android/data/com.codeblast.storagetype/cache
  • Context.getExternalFilesDir:/存储/emulated/0/Android/data/com.codeblast.storagetype/files

在没有外部 SD 卡的模拟器上运行代码会返回完全相同的结果。

所以你不能假设/mnt/sdcard指物理 SD 卡。

您可能已经重新考虑您实际想要完成的任务,而不是尝试检测存储类型。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 外部存储与 SD 卡 的相关文章

  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 如何在android线性布局上获得阴影? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在android中为View设置阴影 https stackoverflow com questions 4406524 how to set shadow to a view in androi
  • android EditText 输入类型用于 StreetNumber 字段

    我试图在地址对话框的 streetNumber 字段中选择正确的 inputType 我想先显示数字键盘 然后让用户输入字母字符 对于一些非常特殊的情况 更接近这个的是 inputType datetime 但这不允许输入字母字符 那么如何
  • Camera.open()返回NULL Android开发

    我正在按照构建相机应用程序的教程进行操作http developer android com tools device html http developer android com tools device html我对 Camera o
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • 获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

    我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角 如此处所述https developer android com guide topics sensors sensors position https
  • 菜单在片段的 onCreateOptionsMenu 处多次膨胀调用

    我使用 Fragments 当我切换到嵌套 Fragment 时 它实现了public void onCreateOptionsMenu Menu menu MenuInflater inflater 当我到达该嵌套片段时 我的菜单会多次膨
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • HERE 地图:更改路线已行驶部分的颜色

    导航时可以改变路线的颜色吗 具体来说 我希望路线中已行驶的部分的颜色与即将行驶的部分的颜色不同 现在都是同一个颜色 将 MapRoute 对象的 TravelColor 变量设置为透明对我来说很有效 mapRoute color Resou
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • 使用 JobScheduler API 进行位置更新

    下面是我使用 FireBaseJobDispatcher 启动作业的演示代码 public class MainActivity extends AppCompatActivity Override protected void onCre

随机推荐

  • Aptana 插件使 Eclipse 崩溃

    我在 Ubuntu 11 04 笔记本电脑上使用 Eclipse EE Indigo 我使用Sun JDK 当我使用帮助 安装新软件安装 aptana 插件 然后通过粘贴安装 aptana 时 http download aptana co
  • 线程安全队列有问题吗?

    我正在尝试使用 C 中的 pthreads 编写线程安全队列 我的程序在 93 的情况下都能运行 另外 7 的时间它会吐出垃圾 或者似乎睡着了 我想知道我的队列中是否存在一些缺陷 上下文切换会破坏它 thread safe queue in
  • http 收到 304 但仍然下载内容

    我请求了一个html文件 我得到了http状态代码304 我知道这意味着内容没有被修改 所以浏览器可以使用缓存 但我注意到请求计时信息中内容下载用了 2 63 秒 我用 Chrome 开发工具进行了调试 既然浏览器有缓存 为什么它仍然下载内
  • s3直接上传限制文件大小和类型

    一个新手问题 但我用谷歌搜索了一下 似乎找不到任何解决方案 我希望允许用户直接将文件上传到 S3 而不是先通过我的服务器 通过这样做 有什么方法可以在实际上传到 S3 之前检查文件的大小限制和允许的类型吗 最好不要使用 flash 而使用
  • 将 Kafka 中的 Avro 转换为 Parquet 直接转入 S3

    我的 Kafka 主题以 Avro 格式存储 我想使用整个主题 在收到时不会更改任何消息 并将其转换为 Parquet 直接保存在 S3 上 我目前正在这样做 但它需要我一次使用来自 Kafka 的消息并在本地计算机上处 理 将它们转换为
  • 删除最后一次出现数值后的所有内容

    我需要删除最后一次出现数值后的所有内容 如下所示 1234D应该1234 ABCD1234A BC应该ABCD1234 这个方法应该可以为你做到 public string StripAfterLastNumber string s int
  • Android 中用于确认码的虚线输入字段

    我正在尝试为 android 布局中的数字创建一个虚线输入字段 例如 我可以在其中添加 4 个数字并将它们放入我的主要活动中 我进行了很多搜索 但没有找到更好的解决方案 使用这个库来实现您的目标 https github com gloma
  • 无法添加应用程序 ID,因为已超出“7”天内的“10”个应用程序 ID 限制[重复]

    这个问题在这里已经有答案了 I m getting this weird error when I try to hit this button to fix this error for the app I just made I am
  • 如何使用 Spring Data REST 更新 @ManyToOne 关系?

    我将 Spring Data REST 与 JPA 结合使用 我有一个 User 实体 它与另一个在单独的 RDBMS 表中建模的名为 AccountStatus 的实体具有多对一关系 JSON 表示如下所示 id 123 username
  • ModuleNotFoundError:没有名为“django”的模块

    我已经使用 django 在虚拟环境中构建了一个站点 并按照 AWS 文档中的步骤部署该站点 我已使用 Elastic Beanstalk 将我的网站部署到 AWS Web 服务器 并设置了运行 3 6 和 django 2 1 1 的 p
  • Domino 8.5.3 64 位中 HTTPJVMMaxHeapSize 的最佳设置

    我试图找到关于 Domino 8 5 3 FP4 64 位 Windows 中 JVM 堆大小的最佳设置的明确答案 我知道默认情况下它设置为1024M 一些网站建议建议使用 1G 1024M 但这是默认设置 所以就那么好了吗 其他网站称可用
  • 在 Android VideoView 上绘制叠加层(HUD)?

    我有一个绘制的自定义视图HUD 这是我的布局
  • 约束必须是字符串(或 null)

    我找不到错误来挽救我的生命 错误是 约束必须是字符串 或空 我不知道为什么它会给我这个错误 我必须错过一些简单的东西 我尝试添加 例如 dataPane new JPanel new GridBagLayout 到我所有的面板 什么也没有
  • Scala 中的阻塞关键字

    有什么区别Future blocking blockingCall and blocking Future blockingCall 这两个都定义在scala concurrent 我看过在 scala 文档中 http docs scal
  • 泛型和从不同类调用重载方法 - 优先级问题[重复]

    这个问题在这里已经有答案了 首先 对这个标题感到抱歉 但我想不出更好的了 我的问题可以通过简单的代码示例来呈现 public static class Test
  • mysql - 如何处理使用特殊字符%(百分比)和_(下划线)的查询搜索

    我的数据库中有 2 条记录 Tom Jerry and Ninja Kids 一个有特殊字符 百分比 另一个有 下划线 我在 mysql 终端尝试了以下命令 SELECT FROM CUSTOMER WHERE NAME LIKE SELE
  • 使用 dart 和 flutter 与 google calendar api 来获取用户日历上的事件列表

    我正在尝试通过重新构建我之前用 Java 编写的应用程序来学习如何使用 dart 和 flutter 其中涉及使用 Google 自己的日历 API 从 Google 日历获取事件 通过阅读 不是很详细 googleapis auth 包的
  • Xpath:从 id 属性与 id 锚点的匹配中查找元素值

    我想找到与 id 属性匹配的元素的值 我只有 ref 带 的位 锚点 我正在寻找 partyId 的值 lt party id partyA gt lt partyId gt THEID lt partyId gt 但要到达那里 我只有以下
  • 如何将受信任的证书添加到 OkHttp

    我需要使用 OkHttp 客户端信任一个特定站点的证书 我在这里找到了解决方案 https jebware com blog p 340 https jebware com blog p 340 这段代码与我想要信任的服务器配合得很好 唯一
  • Android 外部存储与 SD 卡

    阅读有关存储文件的 Android 文档后 我发现外部存储可以包括可移动 SD 卡和设备内部存储 即不可移动 选择将文件保存到外部存储时 是否可以区分可移动存储和不可移动存储 我认为您无法可靠地区分内部和外部 SD 存储 乍一看 您似乎可以