Android USB编程



一、什么是USB

USB就是通用串行总线(Universal Serial Bus)的缩写,用于规范主从通信。USB接口支持设备的即插即用和热插拔功能。

与USB有关的OTG既是On-The-Go,主要用于各种不同的设备或移动设备件间的链接和数据交换。

二、Android的USB相关API

包:android.hardware.usb

类:UsbManager/UsbDevice/UsbInterface/UsbEndPoint/UsbDeviceConnection/UsbRequest/UsbConstants/UsbAccessory

获取UsbManager:UsbManager manager = (UsbManager)getSystemService(Context.USB_SERVICE);

三、Android设备与USB设备

第一种模式Host Mode:Android设备作为Host,向Usb设备供电,并进行数据传输;

第一种模式Accessory Mode:Usb设备作为Host,向Android设备供电,并进行数据传输;

四、例子(可以枚举设备/点击设备建立连接/接收数据/发送数据)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.usbhelper"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="21" />

<uses-feature android:name="android.hardware.usb.host" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name=".UsbReceiver" >

<intent-filter android:priority="1000" >

<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

</intent-filter>

</receiver>

</application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.usbhelper"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="21" />

<uses-feature android:name="android.hardware.usb.host" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name=".UsbReceiver" >

<intent-filter android:priority="1000" >

<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

</intent-filter>

</receiver>

</application>

</manifest>

item.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.usbhelper"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="21" />

<uses-feature android:name="android.hardware.usb.host" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name=".UsbReceiver" >

<intent-filter android:priority="1000" >

<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

</intent-filter>

</receiver>

</application>

</manifest>

MainActivity.java

package com.example.usbhelper;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.PendingIntent;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.hardware.usb.UsbDevice;

import android.hardware.usb.UsbDeviceConnection;

import android.hardware.usb.UsbEndpoint;

import android.hardware.usb.UsbInterface;

import android.hardware.usb.UsbManager;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.Toast;

@SuppressLint("NewApi")

public class MainActivity extends Activity {

private Button send = null;

private Button receive = null;

private Button list = null;

private ListView information = null;

private EditText content = null;

private TextView result = null;

private Handler mHandler = null;

private ArrayList<UsbDevice> devicesList = null;

private ArrayList<HashMap<String, Object>> showDevices = null;

private SimpleAdapter adapter = null;

private boolean isRunning = false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

// super.handleMessage(msg);

int what = msg.what;

switch (what) {

case 0: {

String string = msg.obj.toString();

result.setText(result.getText().toString() + "\n" + string);

}

break;

default:

break;

}

}

};

initData();

}

private UsbManager mUsbManager = null;

private void initData() {

findViewsById();

showDevices = new ArrayList<HashMap<String, Object>>();

devicesList = new ArrayList<UsbDevice>();

mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);

registerUsbReceiver();

initListView();

}

private PendingIntent mPermissionIntent = null;

private void registerUsbReceiver() {

mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(

ACTION_USB_PERMISSION), 0);

IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);

registerReceiver(mUsbReceiver, filter);

}

private void findViewsById() {

send = (Button) findViewById(R.id.btn_send_main);

receive = (Button) findViewById(R.id.btn_receive_main);

content = (EditText) findViewById(R.id.et_content_main);

result = (TextView) findViewById(R.id.tv_result_main);

list = (Button) findViewById(R.id.btn_list_main);

information = (ListView) findViewById(R.id.lv_devices_main);

send.setOnClickListener(mOnClickListener);

receive.setOnClickListener(mOnClickListener);

list.setOnClickListener(mOnClickListener);

information.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

mUsbManager.requestPermission(devicesList.get(arg2),

mPermissionIntent);

}

});

}

private void listTheDevice() {

if (mUsbManager == null) {

return;

}

HashMap<String, UsbDevice> devices = mUsbManager.getDeviceList();

Iterator<UsbDevice> iterator = devices.values().iterator();

showDevices.clear();

devicesList.clear();

while (iterator.hasNext()) {

UsbDevice device = iterator.next();

HashMap<String, Object> map = new HashMap<String, Object>();

map.put("device_id", device.getDeviceId());

map.put("device_name", device.getDeviceName());

showDevices.add(map);

devicesList.add(device);

}

if (showDevices.size() > 0) {

adapter = new SimpleAdapter(MainActivity.this, showDevices,

R.layout.item, new String[] { "device_id", "device_name" },

new int[] { R.id.device_id, R.id.device_name });

information.setAdapter(adapter);

}

Toast.makeText(this, "设备数:" + devicesList.size(), Toast.LENGTH_SHORT)

.show();

}

private void initListView() {

HashMap<String, Object> map = new HashMap<String, Object>();

map.put("device_id", "测试数据");

map.put("device_name", "测试数据");

showDevices.add(map);

adapter = new SimpleAdapter(MainActivity.this, showDevices,

R.layout.item, new String[] { "device_id", "device_name" },

new int[] { R.id.device_id, R.id.device_name });

information.setAdapter(adapter);

}

private View.OnClickListener mOnClickListener = new View.OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

int id = arg0.getId();

switch (id) {

case R.id.btn_list_main:

listTheDevice();

break;

case R.id.btn_send_main: {

String message = content.getText().toString();

if (message != null && message.length() > 0) {

new Thread(new SendRunnable(message.getBytes()));

}

}

break;

case R.id.btn_receive_main: {

if (isRunning) {

isRunning = false;

} else {

isRunning = true;

new Thread(new ReceiveRunnable()).start();

}

}

break;

default:

Toast.makeText(MainActivity.this, "我真的不知道你对我做了什么",

Toast.LENGTH_SHORT).show();

break;

}

}

};

private class ReceiveRunnable implements Runnable {

public void run() {

byte[] buffer = new byte[64];

while (isRunning) {

mDeviceConnection.bulkTransfer(epin, buffer, buffer.length, 0);

Message msg = new Message();

msg.what = 0;

msg.obj = new String(buffer);

mHandler.sendMessage(msg);

System.out.println("received true");

}

}

}

private class SendRunnable implements Runnable {

private byte[] buffer;

public SendRunnable(byte[] buffer) {

this.buffer = buffer;

}

public void run() {

int length = mDeviceConnection.bulkTransfer(epout, buffer,

buffer.length, 0);

if (length > 0) {

mDeviceConnection.bulkTransfer(epin, buffer, buffer.length, 0);

Message msg = new Message();

msg.what = 0;

msg.obj = new String(buffer);

mHandler.sendMessage(msg);

}

}

}

// mUsbManager.requestPermission(device, mPermissionIntent);

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

private UsbDeviceConnection mDeviceConnection = null;

private UsbEndpoint epin = null;

private UsbEndpoint epout = null;

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {

} else if (ACTION_USB_PERMISSION.equals(action)) {

synchronized (this) {

UsbDevice mUsbDevice;

mUsbDevice = (UsbDevice) intent

.getParcelableExtra(UsbManager.EXTRA_DEVICE);

if (intent.getBooleanExtra(

UsbManager.EXTRA_PERMISSION_GRANTED, false)) {

if (mUsbDevice != null) {

// call method to set up device communication

UsbInterface intf = mUsbDevice.getInterface(0);

epin = intf.getEndpoint(0);

epout = intf.getEndpoint(1);

mDeviceConnection = mUsbManager

.openDevice(mUsbDevice);

mDeviceConnection.claimInterface(intf, true);

}

} else {

Log.d("UsbHelper", "permission denied for device "

+ mUsbDevice.getDeviceName());

}

}

}

}

};

}

UsbReceiver.java

package com.example.usbhelper;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.sax.StartElementListener;

public class UsbReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context arg0, Intent arg1) {

// TODO Auto-generated method stub

Intent intent = new Intent(arg0, MainActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

arg0.startActivity(intent);

}

}

五、小结

USB通信是一种不会磨灭的通信,你懂的。随着物联网的到来和发展,WIFI/蓝牙/Zigbee火起来的,但随着物联网的进一步发展,USB或者类似的通信协议也将会得到空前的应用,因为,组件化会成为智能产品快速研发的关键,即插即用,安全可靠。

时间: 2024-10-28 11:22:38

Android USB编程的相关文章

Android 网络编程 记录

简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面向数据的协议   TCP协议 传输控制协议,传输层通信协议.   UDP协议 用户数据报协议.传输层协议.   SMTP协议 简单邮件传输协议   SOCKET 套接字 应用层与TCP/IP协议族通信的中间软件抽象层. 类型有两种:TCP套接字和UDP套接字. TCP套接字   在保证可靠性上,採用

Android USB大容量存储时SD卡状态监听(转)

对SD卡状态监听,到现在为止我知道的有两种方式: 1.注册StorageEventListener来监听sd卡状态 StorageEventListener中有onStorageStateChanged()方法,当sd卡状态改变时,此方法会调用,对各状态的判断一般会用到Environment类,此类中包含的有关sd卡状态的常量有: MEDIA_BAD_REMOVAL:表明SDCard 被卸载前己被移除 MEDIA_CHECKING:表明对象正在磁盘检查 MEDIA_MOUNTED:表明sd对象是

Android界面编程——导航栏及菜单(六)

Android界面编程--导航栏及菜单 2.7导航栏及菜单 2.7.1  ActionBar ActionBar是Android3.0(API 11)开始增加的新特性,ActionBar出现在活动窗口的顶部,可以显示标题.icon.Actions按钮.可交互View,可实现应用程序级的导航,如图2.7-1所示 图2.7-1 其中 1. App icon: 主要用于展示App的Logo,如果当前界面不是一级界面,还可以展示返回航. 2.View Control: 用于切换不同的视图或者展示非交互信

第6章 Android驱动编程

第6章  Android驱动编程 通过介绍本章设备驱动.字符设备驱动编程.GPIO驱动程序实例和4*4扫描键盘驱动等内容,熟练掌握了Android驱动编程.Android内核内核模块编程中包括设备驱动和内核模块.模块相关命令.Android内核内核模块编程和内核模块实例程序.Android内核中采用可加载的模块化设计,一般情况下编译的Android内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中.模块相关命令中lsmod列出了当前系统中加载的模块,rmmood用于当前模块卸载,in

Android多线程编程(一)——多线程基础

什么是进程 一个进程是一个独立(self contained)的运行环境,它可以看作一个程序或者一个应用. 什么是线程 而线程是进程中执行的一个任务,Java运行环境是一个包含了不同累和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. Android线程 Android的线程,实际上和Java的多线程编程并没有什么本质上的不同.当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如

Android网络编程网上文章总结

关于网络编程,网上也有许多好的文章,这里我就选了几篇觉得不错的归纳到了一起,仅供参考 Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取数

Android网络编程系列 一 TCP/IP协议族

在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必要进一步的了解,这就要我们了解网络通信层了,提到网络通信层不得不说起ISO-OSI的七层协议经典架构,如图所示: 上图的左边部分就是osi架构模型了, ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标

《Qt on Android核心编程》勘误

我的第一本技术书籍<Qt on Android核心编程>已经出版上市,书中难免疏漏,存在一些文字和技术上的问题,特记录在此. 本文会不停更新,拿到书的朋友发现问题可以回复本文,我回将问题更新到博文中.提前感谢各位啦. <Qt on Android核心编程>的试读样章在这里,点击下载.购买链接在下面: china-pub 亚马逊 京东1 京东2 淘宝惊喜价 编排说明 本文将结合章节和问题发现的先后顺序来编排,具体是酱紫的:每个章节单列出来作为本文的一节,在该节下按时间顺序列出发现的问

《Qt on Android核心编程》介绍

<Qt on Android核心编程>终于尘埃落定,付梓印刷了. 封面 看看封面的效果吧,历经几版,最终就成了这个样子. 看下封皮: 这是立体版效果: 章节内容简介 第 1 章 欢迎来到Qt的世界,让我们看看Qt是什么,能给我们带来什么,又有谁在使用Qt.我们要约会的Qt on Android,它缘起何处,有着怎样曲折婉转的历史,如今的小模样能否让我们爱之如狂-- 第 2 章 当你遇见了合适的人,开始筹划第一次约会,又是兴奋又是惆怅,要不要买花,去哪里买礼物,穿什么衣服,洒什么香水,带什么应对