8

物事は単純でなければなりませんが、ほとんどの場合、Androidではそうではありません。ユーザーがアプリでオプションを選択した場合は、SDカードをフォーマットする必要があります。すでにOSにあるのに、なぜこれを行う必要があるのか​​私に聞かないでください...実用的ではありませんが、実装する必要がある要件です。ご存知かもしれませんが、[設定]、[ストレージ]、[SDカードの消去]のオプションがあります。フローズンヨーグルトのソースコードを見てみましたが、次のようなものです。

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カードの消去からユーザーに画面を開始することができました。

私は立ち往生しているので、どんな助けでも大歓迎です。

4

2 に答える 2

4

まず第一に、.android_secureあなたのアプローチが何であれ、SDカードをフォーマットする前にファイルシステムをアンマウントする必要があるかもしれないと思います。

それで、

アプリに次の権限を含めてみてください。

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設定アプリはすでに2番目の権限を使用しています。

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

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;
  }
}
于 2011-09-13T16:39:22.957 に答える
4

ここで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();
        }
    }
于 2011-09-15T17:17:40.193 に答える