USB接口、读写文件、字符串分割
USB接口
通用串行总线(英语:Universal Serial Bus,缩写:USB)是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
USB是一个外部总线标准,规范电脑与外部设备的连接和通讯。USB接口具有热插拔功能。USB接口可连接多种外设,如鼠标和键盘等。
USB外部存储设备广播监听事件
外部存储设备的状态变化时发出的广播 | SD卡、U盘等外部存储设备 |
---|---|
ACTION_MEDIA_BAD_REMOVAL | 外部存储媒体已经从SD卡槽中移除,但其挂载节点还没有被卸载。挂载节点的路径仍然包含在Intent.mData字段里。 |
ACTION_MEDIA_BUTTON | “Media”按钮被按下。包括一个额外的字段,EXTRA_KEY_EVENT,导致了这个广播包含该关键事件 |
ACTION_MEDIA_CHECKING | 外部存储媒体存在,并且将要被检查。挂载节点的路径包含在Intent.mData字段里。 |
ACTION_MEDIA_EJECT | 用户表示希望删除外部存储媒体。当应用程序收到这个意图时,应当关闭在此挂载节点打开的所有文件。 |
ACTION_MEDIA_MOUNTED | 外部存储媒体存在,并且已经挂载成功。挂载节点的路径包含在Intent.mData字段里。此外Intent还包含了一“read-only”的布尔型附加信息用来表示此存储媒体是否为只读,antGreen |
AcTION_MEDIA_NOFS | 外部存储媒体存在,但系统不兼容它。挂载节点的路径包含在Intent.mData字段里。 |
ACTION_MEDIA_REMOVED | 外部存储媒体已经被移除。其挂载节点的路径包含在Intent.mData字段里。 |
AeTION_MEDIA_SCANNER_FINISHED | 存储媒体扫描器完成了一个路径的扫描。扫描的路径包含在Intent.mData字段里。 |
ACTION_MEDIA_SCANNER_SCAN_PILE | 请求媒体扫描器扫描一个文件,并将它添加到媒体数据库。被扫描到的文件路径包含在Intent.mData字段里。 |
ACTION_MEDIA_SCANNER_STARTED | 存储媒体扫描器开始扫描一个目录。将要扫描的路径包含在Intent.mData字段里。 |
可以分四种情况
- 插入外部SD卡时:
android.intent.action.MEDIA_CHECKING
android.intent.action.MEDIA_MOUNTED
android.intent.action.MEDIA_SCANNER_STARTED
android.intent.action.MEDIA_SCANNER_FINISHED - 移除外部SD卡时:
android.intent.action.MEDIA_EJECT
android.intent.action.MEDIA_UNMOUNTED
android.intent.action.MEDIA_SCAnER_STARTED
android.intent.action.MEDIA_BAD_REMOVAL
android.intent.action.MEDIA_SCANMNER_FINISHED - 连接PC进入USB大容量存储模式时:
android.intent.action.MEDIA_EJECT
android.intent.action.MEDIA_UNMOUNTED
android.intent.action.MEDIA_UNMOUNTED
android.intent.action.MEDIA_SHARED - 连接PC退出USB大容量存储模式时:
android.intent.action.MEDIA_UNMAOUNTED
android.intent.action.MEDIA_CHECKING
android.intent.action.MEDIA_MOUNTED
android.intent.action.MEDIA_SCANNER_STARTED
android.intent.action.MEDIA_SCANNER_FINISHED
动态注册广播,利用拔插广播监听USB存储设备的接入弹出,记得注销广播
@Override
protected void onResume(){
super.onResume();
IntentFilter intentFilter_USB = new IntentFilter();
intentFilter_USB.addAction("com.android.example.USB_PERMISSION");
intentFilter_USB.addAction(ACTION_USB_DEVICE_ATTACHED);//动作USB设备已连接
intentFilter_USB.addAction(ACTION_USB_DEVICE_DETACHED);//动作USB设备已分离
intentFilter_USB.addAction(ACTION_MEDIA_MOUNTED);//动作媒体安装
intentFilter_USB.addAction(ACTION_MEDIA_REMOVED);//行动媒体被删除
registerReceiver(receiver_USB, intentFilter_USB);
}
private BroadcastReceiver receiver_USB = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
switch (action) {
case ACTION_USB_DEVICE_ATTACHED:
Log.i("LXH", "USB设备连接");
break;
case ACTION_USB_DEVICE_DETACHED:
Log.i("LXH", "USB设备连接断开");
break;
case ACTION_MEDIA_MOUNTED:
Log.i("LXH", "USB加载完毕");
break;
case ACTION_MEDIA_UNMOUNTED:
Log.i("LXH", "USB取消挂载");
break;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver_USB);
}
运行后将U盘接入USB接口,再弹出U盘,得到日志为
onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。onResume()是onPause()(通常是当前的acitivty被暂停了,比如被另一个透明或者Dialog样式的Activity覆盖了),之后dialog取消,activity回到可交互状态,调用onResume()。看到的一篇 onstart和resumed区别.
USB外部存储设备获取
获取USB接口上的外部存储设备,插入两个U盘在接口上,如果接的不是存储设备而是输入设备如鼠标、键盘灯,则不显示出来
UsbManager usbManager;//USB初始化
PendingIntent pendingIntent;//USB权限
UsbDevice usbDevice_link;//USB设备
usbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent("com.android.example.USB_PERMISSION"), 0);
HashMap<String, UsbDevice> deviceHashMap = usbManager.getDeviceList();
Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
while (iterator.hasNext()) {
UsbDevice device = iterator.next();
Log.i("LXH","获取到的USB设备有 DeviceName:"+device.getDeviceName()+",VendorId:"+device.getVendorId()+",ProductId:"+device.getProductId());
usbDevice_link=device;
}
运行日志:
获取USB接口外部存储设备地址
/**
* @LXH 获取USB A接口的路径
* @return A接口的路径
*/
public String get_USBpath_A() {
String USBpath_A = "";
File file_a = new File("/mnt/sda/");//海思U盘挂载路径
if (file_a.exists()) {
for (File subFile : file_a.listFiles()) {
File findFile = new File(subFile.getPath());
if (findFile.exists()) {
Tag_USB_a = true;
USBpath_A = findFile.getPath();
text_USB_a = USBpath_A;
Log.i("LXH", "获取当前的USB接口路径有A:" + text_USB_a);
break;
}
}
}
return USBpath_A;
}
运行日志
文件
获取指定文件路径
/**
* @LXH 获取指定文件路径
* @return 指定文件路径
*/
public String get_Filepath_LXH(){
String filepath_LXH="";
File file=new File("/mnt/sda/");
if(file.exists())
{
for (File subFile :file.listFiles())
{
File findFile=new File(subFile.getPath()+"/LXH.txt");
if(findFile.exists())
{
file_usb=subFile;
Tag_USB_pz=true;
filepath_LXH=findFile.getPath();
text_USB_pz=filepath_LXH;
Log.i("LXH","U盘下的指定文件路径:"+text_USB_pz);
break;
}
}
}
return filepath_LXH;
}
获取文件下的所有文件
File ffile = new File(text_USB_a);
get_Fileall(ffile);
/**
* @LXH 获取文件下的所有文件
* @param path 该文件
*/
public void get_Fileall(File path){
File files[] = path.listFiles();
if(files != null){
for (File f : files){
if(f.isDirectory()){
get_Fileall(f);
}else{
Log.i("LXH","该文件下:" + f);
}
}
}
}
读取文件路径下的数据
try {
get_File(text_path);
} catch (IOException e) {
e.printStackTrace();
}
/**
* @LXH 读取文件路径下的数据
* @param filePathName
* @return 读取的数据 类型:字符串
* @throws IOException
*/
public String get_File(String filePathName) throws IOException {
String get_file="";
StringBuffer stringBuffer = new StringBuffer();
String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {
FileInputStream fileInputStream = new FileInputStream(filePathName);
byte[] buffer = new byte[1024];
int len = fileInputStream.read(buffer);
while (len > 0) {
stringBuffer.append(new String(buffer, 0, len));
len = fileInputStream.read(buffer);
}
fileInputStream.close();
}
get_file=stringBuffer.toString();
text_USB_pznr=get_file;Tag_USB_pznr=true;
Log.i("LXH","读取文件的内容为:"+get_file);
return get_file;
}
写数据到文件路径下
try {
write_File(text_path,"configure=1,\nversion=2,\nLXH=5,");
} catch (IOException e) {
e.printStackTrace();
}
/**
* @LXH 写文件数据进去
* @param filePathName 文件
* @param content 数据字符串
* @throws IOException
*/
public void write_File(String filePathName, String content) throws IOException {
String storageState = Environment.getExternalStorageState();
if (storageState.equals(Environment.MEDIA_MOUNTED)) {
FileOutputStream fileOutputStream = new FileOutputStream(filePathName);
fileOutputStream.write(content.getBytes());
fileOutputStream.close();
}
}
字符串分隔
configure=1,
version=2,
/**
* @LXH 拆分字符串
* @param filedata 字符串
*/
public void split_String(String filedata){
String str = null;
str = filedata;
if (str != null) {
String[] arrayOfString1 = str.split(",");
for (int i = 0; i < arrayOfString1.length; i++) {
String string = arrayOfString1[i];
if (string.contains("configure")){
Log.i("LXH",string.split("=")[0]+" 的值为:"+string.split("=")[1]);
} else if (string.contains("version")) {
Log.i("LXH",string.split("=")[0]+" 的值为:"+string.split("=")[1]);
}
}
}
}
读取文件的内容为:configure=1,
version=2,
LXH=5,
configure 的值为:1
version 的值为:2