如何在Android 4.2中以编程方式卸载USB DRIVE

时间:2014-07-16 14:24:17

标签: android android-sdcard unmount

我已经阅读了很多关于这个主题的帖子,但我还没有找到解决方案。 在我的应用程序中,我需要在将文件从USB DRIVE复制到平板电脑后卸载USB驱动器,这样我就可以安全地将其删除而无需使用“设置”菜单。

现在我正在使用这种方法:

Utility.copyDirectory(file,new File(_CURR_FOLDER));
Process su;
su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "umount" +
             " " + SDPath + "\n" + "exit\n";
             su.getOutputStream().write(cmd.getBytes());

我在存储设置中得到的是:

  

总空间0.0   可用0.0

但SD仍然安装。

提前感谢您的帮助。

首先编辑:

有人知道如何使用IMountService吗?我读到了它,也许是解决USB驱动器卸载的正确方法,但在添加classes-full-debug.jar之后我的项目不再编译了

2 个答案:

答案 0 :(得分:1)

这是不可能做到的。许多用户将所有内容(如歌曲,视频,照片)存储在那里。不允许应用程序卸载SD卡,但使用它们存储数据是一个很好的安全决定。

但是您可以将用户发送到设置并且用户可以执行此操作,而不是通过代码

Intent i = new Intent(android.provider.Settings.ACTION_MEMORY_CARD_SETTINGS);
startActivity(i);

打开那个屏幕......

enter image description here

我认为这会有用

答案 1 :(得分:0)

这就是我必须在 Android 6.0.1 上做的事情,希望它与4.2相同。

我必须在编译android之后将库 SDK / out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes-full-debug.jar 添加到我的应用程序中。 (我刚刚从here下载了棒棒糖版本,幸好它也适用于棉花糖)

Android工作室会抱怨内存不足错误,这可以通过将以下代码添加到android部分内的build.gradle来解决。

dexOptions {
    javaMaxHeapSize "4g"
}

您还需要通过在defaultConfig部分的build.gradle中添加以下行来添加multidex支持。

multiDexEnabled true

在依赖项部分中添加以下行。

compile 'com.android.support:multidex:1.0.0'

在清单内的应用程序部分添加以下行。

android:name="android.support.multidex.MultiDexApplication"

您的apk必须位于 / system / priv-app 目录中并具有以下权限。

<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />

然后下面的代码应该可以工作。

private void unmount() {
    IMountService mountService = getMountService();
    try {
        if (mountService != null) {
            mountService.unmountVolume("/mnt/media_rw/8842-89A4", true, false);
            Log.e(TAG,"Unmounted");
        } else {
            Log.e(TAG, "Mount service is null, can't unmount");
        }
    } catch (RemoteException ex) {
        // Not much can be done
    }
}

private synchronized IMountService getMountService() {
    if (mMountService == null) {
        IBinder service = ServiceManager.getService("mount");
        if (service != null) {
            mMountService = IMountService.Stub.asInterface(service);
        } else {
            Log.e(TAG, "Can't get mount service");
        }
    }
    return mMountService;
}