android - 在 Android 中格式化 SD 卡

标签 android format android-sdcard erase

事情应该很简单,但在大多数情况下,在 Android 中却并非如此。如果用户在我的应用程序中选择该选项,我需要格式化 SD 卡。如果它已经在操作系统中,请不要问我为什么需要这样做……不切实际,但这是我需要实现的要求。您可能知道,设置\存储\删除 SD 卡中有一个选项。我看了一下 froyo 的源代码,它是这样的:

final IMountService service =
         IMountService.Stub.asInterface(ServiceManager.getService("mount"));
        if (service != null) {
            new Thread() {
                public void run() {
                try {
                        service.formatVolume(Environment.getExternalStorageDirectory().toString());
                    } catch (Exception e) {
                        // Intentionally blank - there's nothing we can do here
                    Log.w("MediaFormat", "Unable to invoke IMountService.formatMedia()");
                    }
                }
            }.start();
        } else {
            Log.w("MediaFormat", "Unable to locate IMountService");
        }

它使用 android.os.storage.IMountServiceandroid.os.ServiceManager 但我似乎无法访问它。因此,正如我所见,我可以递归搜索每个文件并将其删除,但这“不符合我的口味”……或者我可以从删除 SD 卡到用户启动屏幕。

任何帮助都非常受欢迎,因为我被困住了。

最佳答案

首先,我认为您可能需要在格式化 SD 卡之前卸载 .android_secure 文件系统,无论您采用何种方法。

然后,

尝试在您的应用中包含以下权限:

1) MOUNT_FORMAT_FILESYSTEMS - http://developer.android.com/reference/android/Manifest.permission.html#MOUNT_FORMAT_FILESYSTEMS

2) MOUNT_UNMOUNT_FILESYSTEMS - http://developer.android.com/reference/android/Manifest.permission.html#MOUNT_UNMOUNT_FILESYSTEMS

Android 设置应用已经使用第二个权限。

============================================= =================================

当您执行 AOSP 或任何其他分发代码的构建时,IMountService.java 文件会自动生成。它包含以下函数,我猜它实际上将格式化命令发送到 vold 守护进程。:

private static class Proxy implements android.os.storage.IMountService
{
  private android.os.IBinder mRemote;
  Proxy(android.os.IBinder remote)
  {
    mRemote = remote;
  }

  public android.os.IBinder asBinder()
  {
    return mRemote;
  }

  // **** A LOT OF OTHER CODE IS HERE.....

  public int formatVolume(java.lang.String mountPoint) throws android.os.RemoteException
  {
    android.os.Parcel _data = android.os.Parcel.obtain();
    android.os.Parcel _reply = android.os.Parcel.obtain();
    int _result;
    try {
      _data.writeInterfaceToken(DESCRIPTOR);
      _data.writeString(mountPoint);
      mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
      _reply.readException();
      _result = _reply.readInt();
    }
    finally {
      _reply.recycle();
      _data.recycle();
    }
    return _result;
  }
}

关于android - 在 Android 中格式化 SD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7405173/

相关文章:

cocoa - NSKeyedArchiver 内部格式

python - 具有可变数字参数的 Python 中的字符串格式

java - 从 SD 卡读取文件的标准方法

Android - 如何获取 friend 的位置

Android:如何从后台删除 fragment ?

parsing - 这是什么类型的数据格式(冒号和分号分隔的条目)?

Android:如何获得可移动SD卡的永久写入权限?

Android:FileObserver 只监控顶级目录

android - Yahoo 身份验证中的 400 错误请求

android - 如何恢复现有任务的当前状态