【问题标题】:How to know if fsck is running?如何知道 fsck 是否正在运行?
【发布时间】:2013-09-19 23:29:53
【问题描述】:

我的 Android 应用需要存储 15 GB 的数据,所以它需要使用 removable storage。所以我需要在我的应用程序加载时检查 fsck 是否正在运行(如果是这种情况则退出)。我当然可以做一个

Runtime.getRuntime().exec("ps");

但我已经读到这个解决方案不可靠......所以我尝试了

ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningAppProcessInfo tasks : manager.getRunningAppProcesses()) {
     System.out.println(" ########## " + tasks.processName + " #######");
}

但我没有看到任何fsck。实际上,使用ps 我认为它被执行为

/system/bin/fsck.exfat -R -f /dev/...

是使用Runtime.getRuntime().exec("ps")的唯一方法吗?

谢谢!

L.

编辑

Environment.getExternalStorageState() 命令对我不起作用。卸载/安装 SD 卡后,使用下面的代码,我得到 AT THE SAME TIME,MOUNTED/system/bin/fsck.exfat -R -f /dev/...

String line;
BufferedReader br;
try {
    br = new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec("ps").getInputStream()));
    while ((line = br.readLine()) != null) {
    if (line.contains("/fsck")) 
        System.out.println("### PS:" + Environment.getExternalStorageState() + " ### " +line);
} catch (IOException e1) {
     e1.printStackTrace();
}

这是我得到的输出:

PS:mounted ### root  [...] D /system/bin/fsck.exfat /dev/...

【问题讨论】:

  • 为什么你需要知道这个?如果您担心外部存储状态不佳,可以查看Environment.getExternalStorageState()
  • @kcoppock:仅仅因为你错了。 Environment.getExternalStorageState() 确实 NOT 返回许多设备中的外部存储,但返回内部存储器(即使插槽中没有任何 SD 卡,三星 Galaxys 总是返回 MOUNTED)。文档明确警告这一点。这被称为解决方案的次数令人惊讶......
  • “仅仅因为你错了”——不,他不是。请阅读the documentation。如果您担心Environment.getExternalStorageState() 之外的其他内容,那么您关注的是外部存储之外的其他内容。所有关于其他数据存储的行为的赌注都没有了,如果你担心fsck,那将是一个巨大的霓虹灯信号,表明你的工作水平远远超出了Android SDK开发人员的水平应该做的。
  • "那么:如何强制 ExternalStorageState() 查找 SD 卡(或任何我想要的)状态? ——你不能。有官方的外部存储,就是这样。除此之外的任何内容(如果存在)均不受支持。引用文档:“使用内部存储分区作为外部存储的设备也可能提供 SD 卡插槽。在这种情况下,SD 卡不是外部存储的一部分,您的应用程序无法访问它(额外的存储空间仅用于系统扫描的用户提供的媒体)。”
  • 如果应用程序在 SD 卡未准备就绪时打开会怎样?如果抛出异常,为什么不在启动过程中捕获异常并决定是否继续?

标签: android runtime activity-manager fsck


【解决方案1】:

杰夫夏基writes:

好消息!在 KitKat 中,现在有一个公共 API 用于与这些辅助共享存储设备进行交互。

新的Context.getExternalFilesDirs()Context.getExternalCacheDirs() 方法可以返回多个路径,包括主设备和辅助设备。然后您可以遍历它们并检查Environment.getStorageState()File.getFreeSpace() 以确定存储文件的最佳位置。这些方法也可以在 support-v4 库中的 ContextCompat 上找到。

另请注意,如果您只对使用Context 返回的目录感兴趣,则不再需要READ_WRITE_EXTERNAL_STORAGE 权限。今后,您将始终拥有对这些目录的读/写访问权限,而无需其他权限。

应用还可以通过终止其权限请求来继续在旧设备上运行,如下所示:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多