【发布时间】:2019-08-30 14:17:40
【问题描述】:
我正在使用libaums 库(版本 0.7.0)通过 USB 读卡器读取 SD 卡。
我遇到的问题是,如果我没有进入手机存储选项并选择在移除 SD 卡之前先卸载它,那么当我取出它时它总是会损坏,即使我实际上并没有给它写任何东西(当插入 Windows 机器时,Windows 会抱怨它)。调用device.init() 足以触发问题。
我想知道我是否可能错误地使用了该库,或者没有其他问题,有一种方法可以在我完成后自动从我的应用程序中卸载 USB 读卡器?据我了解,调用device.close() 应该足以刷新数据并保护卡以供移除。
这是我用于访问卡的代码:
private class FindDevicesTask extends AsyncTask<Integer, Integer, String> {
private WeakReference<Context> mContext;
FindDevicesTask (Context context){
mContext = new WeakReference<>(context);
}
@Override
protected String doInBackground(Integer... dummy) {
Context ctx = mContext.get();
if (ctx == null)
return null; // Context expired
UsbMassStorageDevice[] devices = UsbMassStorageDevice.getMassStorageDevices(ctx);
for (final UsbMassStorageDevice device : devices) {
// If we don't have permission, request it and leave this function (if we get
// permission the function will be called again)
if (!mUsbManager.hasPermission(device.getUsbDevice())) {
mUsbManager.requestPermission(device.getUsbDevice(), mPermissionIntent);
return null;
}
try {
device.init();
// Do work
} catch (IOException e) {
return e.getMessage();
} finally {
device.close();
}
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (result == null || result.isEmpty())
return;
Context ctx = mContext.get();
if (ctx != null)
displayString(result, "USB connection error", ctx);
}
};
首先调用new FindDevicesTask(context).execute();
【问题讨论】:
-
嘿,这很奇怪。如果不调用 device.close() 也会发生这种情况吗?如果您不更改任何内容,则不应写入任何内容...您是否可以在块设备的写入命令中添加一些调试语句以确保没有写入。如果不写入设备,这种行为非常奇怪......
-
当我省略 device.close() 并且除了调用 device.init() 之外不执行任何操作时,没有您怀疑的问题。我在 ByteBlockDevice、ScsiBlockDevice 和 FileBlockDeviceDriver 中的 write 函数中添加了断点。调用 device.close() 时,它们都没有触发。
-
是的,这就是我的想法。没有写入设备发生。所以现在可能只是在没有 device.close() 的情况下使用它,因为这只会释放一些 Android 特定的 USB 主机资源。在文件系统级别上,只要您在完成写入文件时调用 flush 或 close,所有内容都应传输到设备。