【问题标题】:Format SD card in Android在 Android 中格式化 SD 卡
【发布时间】:2011-11-16 08:06:30
【问题描述】:

事情应该很简单,但在大多数情况下,在 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 卡向用户启动屏幕。

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

【问题讨论】:

    标签: android format android-sdcard erase


    【解决方案1】:

    首先,我认为您可能需要在格式化 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;
      }
    }
    

    【讨论】:

    • 知道了,关于权限,但仍然不知道如何实现实际的格式化操作。谢谢你的回答。
    • 您打算在您的应用中使用 root (su) 权限吗?
    • 挂载服务检查代码中的 MOUNT_UNMOUNT_FILESYSTEMS。另一种可能性是系统应用程序使用“平台”密钥签名,普通应用程序无法复制。
    【解决方案2】:

    我在这里找不到关于 SO 的问题,但它有一个可行的解决方案。所以所有的功劳都归于那个人;)

    public void wipeMemoryCard() {
            File deleteMatchingFile = new File(Environment
                    .getExternalStorageDirectory().toString());
            try {
                File[] filenames = deleteMatchingFile.listFiles();
                if (filenames != null && filenames.length > 0) {
                    for (File tempFile : filenames) {
                        if (tempFile.isDirectory()) {
                            wipeDirectory(tempFile.toString());
                            tempFile.delete();
                        } else {
                            tempFile.delete();
                        }
                    }
                } else {
                    deleteMatchingFile.delete();
                }
            } catch (Exception e) {
                Utils.log(e.getMessage());
            }
        }
    
        private static void wipeDirectory(String name) {
            File directoryFile = new File(name);
            File[] filenames = directoryFile.listFiles();
            if (filenames != null && filenames.length > 0) {
                for (File tempFile : filenames) {
                    if (tempFile.isDirectory()) {
                        wipeDirectory(tempFile.toString());
                        tempFile.delete();
                    } else {
                        tempFile.delete();
                    }
                }
            } else {
                directoryFile.delete();
            }
        }
    

    【讨论】:

    • 这个方法确实是删除文件。但是这种方法并不能阻止数据恢复软件恢复原始数据。我正在寻找方法。
    • @peacepassion 那么在您的情况下,您需要一些专用算法。算法的复杂性取决于需要保护的程度。检查这些链接en.wikipedia.org/wiki/Data_erasuresemshred.com/hybrid_hard_drives
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多