在许多Android设备上,当设备插入计算机的USB端口或甚至某些USB充电设备时,手机将进入USB存储模式.当设备处于此模式时,Android应用程序无法访问SD卡.有没有办法(1)检测设备何时处于此模式,(2)以编程方式关闭USB存储,至少暂时,所以我的Android应用程序可以访问SD卡?
我已经看到其他SO问题并且答案还不够(例如,Android:检测USB).
挑战:我有一个Linux手持设备,它记录数据并将其存储到光盘.它应该通过USB与Windows应用程序交换这些数据.当用户可以访问这些数据时 - 例如通过USB大容量存储 - 它必须加密.它应该是开箱即用的,具有各种操作系统,也适用于Citrix终端会话等.
计划:我使用FUSE在用户空间中创建文件系统,并通过大容量存储将其提供给Windows.每当Windows访问一个文件时,我都会得到回调并动态加密数据.此外,我们可以拥有一些动态内容 - 例如,当某些密码被写入文件时,会显示更多内容.
问题:当使用海量存储小工具(例如g_file_storage)时,它只接受文件或块设备 - 但不接受文件系统(目录).为什么?
[...]它为读取和写入数据扇区提供了一个简单的接口 - 非常类似于用于访问任何硬盘驱动器的低级接口[...].操作系统可以将USB驱动器视为硬盘驱动器,并可以使用他们喜欢的任何文件系统对其进行格式化.(来自维基百科)
所以没有机会通过大容量存储来建立动态文件系统......这似乎是为什么当我将它连接到PC时,为什么我的Android手机会在手机上卸载所有数据.
选项:
目前,只有最后一个选项似乎是现实的 - 或者你还有另一个提示吗?
我会很感激!
查理
我有几个USB驱动器连接到WinXP SP3计算机,我需要以编程方式区分它们 - 我需要找到哪个驱动器号对应于哪个设备(在这种情况下,一个设备〜一个卷).我可以使用他们的卷ID和驱动器号mountvol
,看起来像这样:
C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
C:\
\\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\
A:\
Run Code Online (Sandbox Code Playgroud)
此外,使用devcon或设备管理器,我可以看到设备ID:
C:\WINDOWS\> devcon resources *STOR*
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
Name: Generic volume
STORAGE\VOLUME\1&30A96598&0&SIGNATURED84ED84EOFFSET7E00LENGTH2543150400
Name: Generic volume
USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER2.0&REV_1.00\0803240752536&0
Name: Kingston DataTraveler2.0 USB Device
Run Code Online (Sandbox Code Playgroud)
但是,我还没有找到一种方法来链接设备ID和卷ID /字母,就像"安全删除硬件"对话框一样(因此我认为它是可能的):
通用卷 - 答:http://stuff.piskvor.org/safely_remove.png
正如您所看到的,这些是我在devcon中看到的设备和mountvol看到的相同的设备; 但到目前为止我还没有找到它们之间的联系.
我发现了一些相关的 问题,但是那些似乎使用的方法"无论你先找到的是你的USB设备",这在我的情况下都不是很有用,因为会有几个类似的设备(相同的供应商,通常是相同的产品类型) ) 连接的.
编辑:
@MSalters的答案看起来很有希望:在XP上,HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
有REG_BINARY
值\DosDevices\x:
(其中x
是[AZ]); 注释是(UTF-16)正确设备的名称(例如
\DosDevices\A:
=" \??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\"
,其对应于
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
上面在设备列表中看到的).
将会看到这是否可行.
当设备连接到pc时,我想让USB Mass Storage活动打开或关闭usb模式.我已经实现了如下应用程序.
public class USB_ConnectActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String state = Environment.getExternalStorageState();
((Button)findViewById(R.id.onButton)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!(Environment.MEDIA_SHARED.equals(state))) {
//How to navigate android USB Mass Storage page
}
}
});
((Button)findViewById(R.id.offButton)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if ((Environment.MEDIA_SHARED.equals(state))) {
//How to navigate android USB Mass Storage page
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码我已经使用两个按钮关闭和USB大容量存储.但我没有更多的信息来在内置USB大容量存储页面导航android.请任何人帮我.
我需要从我的应用程序中打开USB Mass Storage Activity.
有没有Intent
这样做?
就像是
startActivity(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS))
我有几个USB大容量存储闪存驱动器连接到Ubuntu Linux计算机(Ubuntu 10.04.1,内核2.6.32-25-386),我需要以编程方式区分它们(如果可能的话,从bash,但我不害怕编译或者 - 我需要找到哪个块设备对应哪个物理设备(例如/dev/sdb1
- > USB端口1中的设备;在我的情况下,一个设备〜一个卷).
换句话说,我知道我有三个硬件设备插入USB端口; 它们中的每一个都作为USB大容量存储设备(如lsusb所示)显示在系统中,创建为块设备(/dev/sdb1
)并由UUID(/media/1234-5678
)自动安装.
USB device block device mountpoint
USB device in port 2.2 <-> /dev/sdb1 <-> /media/1234-5678
Run Code Online (Sandbox Code Playgroud)
我不是想找到块设备和mountpoint之间的关系; 我试图找到块设备和USB设备之间的关系,有没有办法?
为什么?磁盘上会有一些写入,完成时间不可预测.我需要给操作员一些指示,例如"你现在可以移除端口2中的磁盘(左起第二个)".我发现哪个物理端口对应于该特定机器上的哪个端口号,并且从挂载点查找块设备很简单; 现在,我无法将逻辑USB端口映射到阻止设备.
我可以看到带有lsusb的磁盘:
Bus 001 Device 058: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device
Bus 001 Device 060: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device
Bus 001 Device 061: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device
Run Code Online (Sandbox Code Playgroud)
我可以看到它们被挂载(通过它们的UUID):
/dev/sdb1 on /media/BC88-15C4 type vfat …
Run Code Online (Sandbox Code Playgroud) 给定 udev 传递给我的内核模块(可能是块设备路径)的信息,我如何将 SCSI 命令发送到块设备?(但让它正常运行,否则意味着分区已安装,没有数据丢失等)
我有一个 USB 大容量存储设备,它带有通过 SCSI 命令控制的 LED。我想编写一个 LED 驱动程序来为其提供 /sys/class/leds/* 条目。
这里的目标是让设备正常运行(安装和运行分区等),但也允许 /sys/class/leds/* 交互,发送 SCSI 命令来控制 LED。
使用 sg_raw 在用户空间发送我需要的 SCSI 命令很容易。但是我需要一个 kmod 来提供 /sys/class/leds/...
基本上我需要的是ioctl()。但是,我知道从 kmod 中调用 open()、ioct() 等通常是一个坏主意。
linux scsi kernel-module linux-device-driver usb-mass-storage
是否可以使用 BB 作为大容量存储设备?
我希望它连接到一个音频播放器,该播放器可以从 USB 连接(例如 USB 闪存驱动器)读取文件,并充当包含文件系统(如果可能的话,在连接到开发板的闪存驱动器。)。
正如设备规格所述,它具有以下连接性:
操作系统可能是 Ubuntu,但可以更改。
为了实现这一目标,需要完成哪些驱动程序或配置?
目前,我正在考虑以下iOS应用程序,
应用程序:使用闪电的USB3相机适配器,通过MSC(大容量存储类)或MTP(媒体传输协议),浏览文件并将文件从具有USB连接器的设备复制到iPhone。
闪电USB3相机适配器
http://www.apple.com/jp/shop/product/MK0W2AM/A/lightning-usb-3 ???????
我问苹果公司(TSI,技术支持事件)创建了这样的iOS应用程序,他们说iOS SDK不支持MSC / MTP。
通过使用Apple的USB主机适配器(Lightning USB3相机适配器),是否可以通过MSC或MTP通过USB电缆创建应用程序来浏览所连接设备中的文件?
如果您能回答问题或给我一些信息,我们将不胜感激。
谢谢。
我想弄清楚如何检测驱动器是否是大容量存储设备。我可以获得驱动器号,但无法弄清楚如何检测它是哪种设备。我正在尝试检测 Garmin GPS 接收器是否以大容量存储模式连接到 PC。
我需要从 U 盘导入/导出一些数据。有没有办法获取挂载的USB设备的路径?
我的代码看起来像这样:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){
UsbDevice device = deviceIterator.next();
UsbInterface deviceInterface = device.getInterface(0);
if(deviceInterface != null && deviceInterface.getInterfaceClass() == UsbConstants.USB_CLASS_MASS_STORAGE){
// check if path "mnt/usb_storage/*" exist
}
}
Run Code Online (Sandbox Code Playgroud)
当设备是大容量存储时,我可以搜索路径“mnt/usb_storage/*”是否存在。如果仅连接一个 USB 大容量存储,或者当连接第二个 USB 大容量存储时应用程序位于前台,则此功能可以正常工作。如果您想知道,是的,有些 Android 设备具有多个 USB 端口。
当我有UsbManager/UsbDevice/UsbInterface时,没有办法获取路径吗?所有设备上的路径都是“mnt/usb_storage/*”吗?
更新1:
目标 Android 版本 5.1 要求:“文件选择器”必须集成在应用程序内,必须应用文件夹、文件名和文件类型的过滤器。
更新2:
根据@greenapps的建议,我尝试了“ACTION_OPEN_DOCUMENT_TREE”:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
intent.putExtra("android.content.extra.FANCY", true);
intent.putExtra("android.content.extra.SHOW_FILESIZE", true);
startActivityForResult(intent, OPEN_DOCUMENT_TREE_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)
相同设备:es-datei explorer能够显示USB设备。
我的要求是显示一个自定义文件选择器,用户可以从客户特定的云、内部存储或 USB …
我正在编写一个应用程序,通过侦听WM_DEVICECHANGE消息来检测何时插入某个USB大容量存储设备以及何时拔下插头.
我还注册了我的应用程序来监听WM_DEVICECHANGE
消息DBT_DEVTYP_DEVICEINTERFACE
(使用RegisterDeviceNotification API调用),当插入或拔出USB大容量存储设备时,我得到了消息DBT_DEVICEARRIVAL
和DBT_DEVICEREMOVECOMPLETE
消息.
现在,当插入具有多个卷的USB设备,然后拔下插头时,会出现问题.
插入设备时,我收到以下消息:
WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_DEVICEINTERFACE
)WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_VOLUME
)WM_DEVICECHANGE
(DBT_DEVICEARRIVAL
类型DBT_DEVTYP_VOLUME
)插入时出现以下消息:
WM_DEVICECHANGE
(DBT_DEVICEREMOVECOMPLETE
类型DBT_DEVTYP_VOLUME
)WM_DEVICECHANGE
(DBT_DEVICEREMOVECOMPLETE
类型DBT_DEVTYP_DEVICEINTERFACE
)因此,即使有两个卷,也只有一个删除消息.为什么??
我有两个问题:
DBT_DEVTYP_DEVICEINTERFACE
消息与DBT_DEVTYP_VOLUME
消息相关联(实质上,我如何知道哪个VOLUME消息对应于哪个DEVICEINTERFACE消息 - 因为我同时获得了设备)?我正在尝试在 MAC OSX 下发现 USB 大容量存储设备。我希望获得设备类别,并在此基础上决定该设备是否是大容量存储。但是,对于我拥有的所有 USB 闪存驱动器,我得到的设备类 == 0,这似乎是一个复合设备。请帮助我弄清楚我做错了什么,或者,也许还有什么其他可靠的方法来发现 USB 大容量存储设备(我需要获取 PID、VID 和安装点)。这是我的代码:
#import <iostream>
#import <IOKit/IOkitLib.h>
#import <IOKit/usb/IOUSBLib.h>
#import <IOKit/IOCFPlugIn.h>
#import <IOKit/usb/USBSpec.h>
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
CFMutableDictionaryRef matchingDictionary = NULL;
io_iterator_t foundIterator = 0;
io_service_t usbDevice;
matchingDictionary = IOServiceMatching(kIOUSBDeviceClassName);
IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &foundIterator);
for(usbDevice = IOIteratorNext(foundIterator); usbDevice; usbDevice = IOIteratorNext(foundIterator))
{
IOCFPlugInInterface** plugin = NULL;
SInt32 theScore=0;
IOReturn err;
err = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &theScore);
if (err!= 0){
std::cout<<"error, error …
Run Code Online (Sandbox Code Playgroud) usb-mass-storage ×13
usb ×6
android ×4
linux ×4
bash ×1
block-device ×1
c++ ×1
delphi ×1
device ×1
filesystems ×1
iokit ×1
ios ×1
iphone ×1
java ×1
macos ×1
mtp ×1
navigation ×1
scsi ×1
winapi ×1
windows ×1