Форматировать SD-карту на Android

Вещи должны быть простыми, но в большинстве случаев в Android нет. Мне нужно отформатировать SD-карту, если пользователь выбирает эту опцию в моем приложении. Не спрашивайте меня, почему мне нужно это делать, если это уже в ОС … не практично, но это требование, которое мне нужно реализовать. Как вы знаете, в настройках \ Storage \ Erase SD Card есть опция. Я взглянул на исходный код 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.IMountService и android.os.ServiceManager и у меня нет доступа к нему. Поэтому, как я вижу, я мог рекурсивно искать каждый файл и удалять его, но это было бы «не по моему вкусу» … или я мог бы запустить экран с карты Erase SD пользователю.

Любая помощь больше приветствуется, поскольку я застрял.

Solutions Collecting From Web of "Форматировать SD-карту на Android"

Я не могу снова найти здесь вопрос о 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(); } } 

Прежде всего, я думаю, что вам может понадобиться umount .android_secure систему .android_secure перед форматированием SD-карты, независимо от вашего подхода.

Затем,

Попробуйте включить следующие разрешения в ваше приложение:

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

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

Приложение Android Settings уже использует второе разрешение.

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

Когда вы выполняете сборку 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; } }