android监听usb拔插事件

Kexincy 2012-03-19 01:40:57
public class UsbActivity extends Activity {
/** Called when the activity is first created. */

private BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

receiver=new BroadcastReceiver(){

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("+++++++++++","action="+intent.getAction());
Toast.makeText(UsbActivity.this, "action-----"+intent.getAction(), Toast.LENGTH_SHORT).show();
}

};

IntentFilter filter=new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_CHECKING);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_SHARED);
filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
filter.addDataScheme("file");

registerReceiver(receiver,filter);

}


public void onDestroy(){
super.onDestroy();
unregisterReceiver(receiver);
}

}

这是我监听USB拔插事件的程序,在平板上运行的时候,没有任何toast出现,请问问题出在哪?action正确吗?
另外usb的action只在3.1才开始有,现在我要用的是3.0及其之前的东西。
...全文
12875 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
eagledame 2014-04-17
  • 打赏
  • 举报
回复
添加filter.setDataSchema("file");
Kexincy 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 s278777851 的回复:]
经过测试, 只能收到usb拔出的事件。
下面的链接是监听usb设备的文章
http://blog.csdn.net/s278777851/article/details/6956226
[/Quote]

这个是我根据这个网址相关的API写出的程序
UsbAccessory accessory=(UsbAccessory)getIntent().getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
Log.d("+++++++++++","accessory="+accessory);
UsbDevice device=(UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
Log.d("+++++++++++","device="+device);
if(device!=null){
receiver=new UsbBroadcastReceiver();
Intent intent=new Intent("android.hardware.usb.action.USB_DEVICE_ATTACHED");
intent.addCategory("android.hardware.usb.action.USB_DEVICE_DETACHED");
PendingIntent mIntent=PendingIntent.getBroadcast(this, 0, intent, 0);

IntentFilter filter = new IntentFilter();
filter.addAction("android.hardware.usb.action.USB_DEVICE_ATTACHED");
filter.addAction("android.hardware.usb.action.USB_DEVICE_DETACHED");
Usb12Activity.this.registerReceiver(receiver, filter);

UsbManager usbManager=(UsbManager) this.getSystemService(Context.USB_SERVICE);

usbManager.requestPermission(device, mIntent);
}

xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-sdk android:minSdkVersion="12" />

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

<application ...>
<activity ...>
<intent-filter>
...
</intent-filter>

<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/>
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/>

</activity>


xml/device_filter:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" ></usb-device>
</resources>


结果是device一直为空,加了while循环不停判断,还一直为null。

</application>

</manifest>
Kexincy 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 majaw 的回复:]
filter.addAction(UsbManager.ACTION_USB_STATE);
[/Quote]

没有这个action
Kexincy 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dclchj 的回复:]
UsbActivity.this 改为 context 试试?
[/Quote]


不能改context
forlong401 2012-03-22
  • 打赏
  • 举报
回复
mounted和unmounted是说媒体设备挂载和卸载。不代表usb插拔。
usb可以使媒体设备,也可以是其实它设备。
usb做为媒体设备时,mounted消息也不一定就会发出来,因为这需要驱动,还有vold进程,以及MountService这几个地方都设置想要的配置。才会把mounted的Intent发出来。

插拔还是要看
<action android:name="android.hardware.usb.action.USB_STATE"/>,
但你的版本不允许。就没办法了。

版本的问题,可以参看:
http://developer.android.com/guide/topics/usb/index.html
Kexincy 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 work_in_java 的回复:]
<action android:name="android.hardware.usb.action.USB_STATE"/>

这个filter呢?
[/Quote]
木有这个action
work_in_java 2012-03-22
  • 打赏
  • 举报
回复
<action android:name="android.hardware.usb.action.USB_STATE"/>

这个filter呢?
s278777851 2012-03-21
  • 打赏
  • 举报
回复
经过测试, 只能收到usb拔出的事件。
下面的链接是监听usb设备的文章
http://blog.csdn.net/s278777851/article/details/6956226
majaw 2012-03-20
  • 打赏
  • 举报
回复
filter.addAction(UsbManager.ACTION_USB_STATE);
dclchj 2012-03-20
  • 打赏
  • 举报
回复
UsbActivity.this 改为 context 试试?
发帖
Android

7.9w+

社区成员

移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
帖子事件
创建了帖子
2012-03-19 01:40
社区公告
暂无公告