Android USB下的Accessory模式

Android USB开发麻烦还是比较多的。

第一种:host模式


这种模式比较不错,由Android设备提供电源,然后与外部设备通信。举个例子来说:电脑连接USB设备,都是这个模式,非常常见的模式。

但是有一个万恶的问题,android接外部USB设备的时候,驱动怎么办?又有那款芯片敢说Android系统支持他们家的芯片,又有哪个厂家说不动android系统装上他们家的驱动,他们家的设备就可以在Android上使用,或许这点上Android很难超越windows。

造成想现状:想加外部设备,都要:重新自己做底层驱动程序--->编译系统--->刷机--->编写android程序--->接入硬件实现功能。

整个一套下来饭都吃好几顿了。还是希望以后android发展发展能向window一样支持多设备驱动吧。


第二种:Accessory模式


这个模式比较揪心,外部设备要供给电源,数据间通信:电脑---手机就是这种模式,手机作为Accessory设备,电脑供给它电源,同时进行数据通信。

恰巧我也是用了这种模式:

程序需要做的:

(1)添加Action BoardCast

private static final String ACTION_USB_PERMISSION ="com.ukey.USB_PERMISSION";

		/***********************USB handling******************************************/
		usbmanager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
		mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
		IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
		
		filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);		
		context.registerReceiver(mUsbReceiver, filter);
		inputstream = null;
		outputstream = null;

(2)编写对应的boradCaset信息

	/***********USB broadcast receiver*******************************************/
	private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() 
	{
		@Override
		public void onReceive(Context context, Intent intent) 
		{
			String action = intent.getAction();
			if (ACTION_USB_PERMISSION.equals(action)) 
			{
				synchronized (this)
				{
					UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
					if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))
					{
						Toast.makeText(global_context, "Allow USB Permission", Toast.LENGTH_SHORT).show();
						OpenAccessory(accessory);	
						
					}else{
						Toast.makeText(global_context, "Deny USB Permission", Toast.LENGTH_SHORT).show();
					}
					mPermissionRequestPending = false;
				}
			} 
			else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)){
				DestroyAccessory(true);
			}else{
				Log.d("LED", "....");
			}
		}
	};
(3)又来一个比较麻烦的事

android每次使用Accessory的时候都会询问你是否允许设备访问,这会点击是或否的结果又(2)中代码

if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))
去获得,然后才能使用OpenAccessory功能。

	public int OpenAccessory()
	{
		// Intent intent = getIntent();
		if (inputstream != null && outputstream != null) {
			return 1;
		}
		UsbAccessory[] accessories = usbmanager.getAccessoryList();
		if(accessories != null){
			Toast.makeText(global_context, "Accessory Attached", Toast.LENGTH_SHORT).show();
		}else{
			// return 2 for accessory detached case
			return 2;
		}
		UsbAccessory accessory = (accessories == null ? null : accessories[0]);
		if (accessory != null) {
			if( -1 == accessory.toString().indexOf(ManufacturerString)){
				Toast.makeText(global_context, "Manufacturer is not matched!", Toast.LENGTH_SHORT).show();
				return 1;
			}
			if( -1 == accessory.toString().indexOf(ModelString1) && -1 == accessory.toString().indexOf(ModelString2))
			{
				Toast.makeText(global_context, "Model is not matched!", Toast.LENGTH_SHORT).show();
				return 1;
			}if( -1 == accessory.toString().indexOf(VersionString))
			{
				Toast.makeText(global_context, "Version is not matched!", Toast.LENGTH_SHORT).show();
				return 1;
			}
			Toast.makeText(global_context, "Manufacturer, Model & Version are matched!", Toast.LENGTH_SHORT).show();
			if (usbmanager.hasPermission(accessory)) {
				OpenAccessory(accessory);
			}else{
				synchronized (mUsbReceiver) {
					if (!mPermissionRequestPending) {
						Toast.makeText(global_context, "Request USB Permission", Toast.LENGTH_SHORT).show();
						usbmanager.requestPermission(accessory,mPermissionIntent);
						mPermissionRequestPending = true;
					}
				}
			}
		}
		return 0;
	}

启动请求。


(4)openAccessory功能

	/*destroy accessory*/
	public void DestroyAccessory(boolean bConfiged){

		if(true == bConfiged){
			READ_ENABLE = false;  // set false condition for handler_thread to exit waiting data loop
			writeusbdata[0] = 0;  // send dummy data for instream.read going
			SendPacket(1, writeusbdata);
		}else{
			SetConfig((int)9600,(byte)8,(byte)1,(byte)0,(byte)0);  // send default setting data for config
			try{Thread.sleep(10);}
			catch(Exception e){}

			READ_ENABLE = false;  // set false condition for handler_thread to exit waiting data loop
			writeusbdata[0] = 0;  // send dummy data for instream.read going
			SendPacket(1, writeusbdata);
		}
		try{Thread.sleep(10);}
		catch(Exception e){}			
		CloseAccessory();
	}

	/*********************helper routines*************************************************/		

	public void OpenAccessory(UsbAccessory accessory)
	{
		filedescriptor = usbmanager.openAccessory(accessory);
		if(filedescriptor != null){
			usbaccessory = accessory;
			FileDescriptor fd = filedescriptor.getFileDescriptor();
			inputstream = new FileInputStream(fd);
			outputstream = new FileOutputStream(fd);
			/*check if any of them are null*/
			if(inputstream == null || outputstream==null){
				return;
			}
			if(READ_ENABLE == false){
				READ_ENABLE = true;
				readThread = new read_thread(inputstream);
				readThread.start();
			}
		}
		SetConfig((int)9600,(byte)8,(byte)1,(byte)0,(byte)0);
	}

	public void CloseAccessory()
	{
		try{
			if(filedescriptor != null)
				filedescriptor.close();
		}catch (IOException e){}

		try {
			if(inputstream != null)
				inputstream.close();
		} catch(IOException e){}

		try {
			if(outputstream != null)
				outputstream.close();

		}catch(IOException e){}
		/*FIXME, add the notfication also to close the application*/

		filedescriptor = null;
		inputstream = null;
		outputstream = null;
		//System.exit(0);
	}






  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值