package greendrm.android.usbtest; import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; import com.android.future.usb.UsbAccessory; import com.android.future.usb.UsbManager; 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.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; public class UsbTest extends Activity { private static final boolean DEBUG = true; private static final String TAG = "USB"; private static final String ACTION_USB_PERMISSION = "greendrm.android.usbtest.USBPERMISSION"; private UsbAccessory mAccessory = null; private Button mBtSend = null; private ParcelFileDescriptor mFd = null; private FileOutputStream mFout = null; private UsbManager mUsbManager; private PendingIntent mPermissionIntent = null; private boolean mPermissionRequestPending; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (DEBUG) Log.d(TAG, "onCreate()"); mUsbManager = UsbManager.getInstance(this); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION),0); IntentFilter i = new IntentFilter(); //i.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED); i.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); i.addAction(ACTION_USB_PERMISSION); registerReceiver(mUsbReceiver,i); if (getLastNonConfigurationInstance() != null) { mAccessory = (UsbAccessory)getLastNonConfigurationInstance(); openAccessory(mAccessory); } mBtSend = (Button)(findViewById(R.id.btSebd)); mBtSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String s = ((EditText)findViewById(R.id.editText1)).getText().toString(); queueWrite(s); } }); } @Override public Object onRetainNonConfigurationInstance() { if (DEBUG) Log.d(TAG, "onRetainNonConfigurationInstance()"); if (mAccessory != null) { return mAccessory; } else { return super.onRetainNonConfigurationInstance(); } } @Override public void onResume() { if (DEBUG) Log.d(TAG, "onResume()"); super.onResume(); if (mFout != null) { mBtSend.setEnabled(true); return; } UsbAccessory[] accessories = mUsbManager.getAccessoryList(); UsbAccessory accessory = (accessories == null? null : accessories[0]); if (accessory != null) { if (mUsbManager.hasPermission(accessory)) { openAccessory(accessory); mBtSend.setEnabled(true); } else { synchronized(mUsbReceiver) { if (!mPermissionRequestPending) { mUsbManager.requestPermission(accessory, mPermissionIntent); mPermissionRequestPending = true; } } } } else { Log.d(TAG, "mAccessory is null"); } } @Override public void onPause() { if (DEBUG) Log.d(TAG, "onPause()"); super.onPause(); closeAccessory(); mBtSend.setEnabled(false); } @Override protected void onDestroy() { if (DEBUG) Log.d(TAG, "onDestroy()"); unregisterReceiver(mUsbReceiver); super.onDestroy(); } private void openAccessory(UsbAccessory accessory) { mFd = mUsbManager.openAccessory(accessory); if (mFd != null) { mAccessory = accessory; FileDescriptor fd = mFd.getFileDescriptor(); mFout = new FileOutputStream(fd); } else { Log.d(TAG, "accessory open fail"); } } private void closeAccessory() { try { if (mFd != null) { mFout.close(); mFd.close(); } } catch (IOException e) { } finally { mFd = null; mFout = null; mAccessory = null; } } public void queueWrite(final String data){ if(mAccessory == null){ return; } new Thread(new Runnable() { @Override public void run() { try { Log.d(TAG, "Writing length "+data.length()); mFout.write(new byte[]{(byte)data.length()}); Log.d(TAG, "Writing data: "+data); mFout.write(data.getBytes()); Log.d(TAG,"Done writing"); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { UsbAccessory accessory = UsbManager.getAccessory(intent); if (accessory != null && accessory.equals(mAccessory)) { if (DEBUG) Log.d(TAG,"Dettached!"); closeAccessory(); mBtSend.setEnabled(false); } } else if(ACTION_USB_PERMISSION.equals(action)){ l("permission answered"); synchronized(this) { UsbAccessory accessory = UsbManager.getAccessory(intent); if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)){ openAccessory(accessory); mBtSend.setEnabled(true); } else { Log.d(TAG, "permission denied"); } mPermissionRequestPending = false; } } else { Log.d(TAG, "Unknown action: " + action); } } }; private void l(String l){ if (DEBUG) Log.d(TAG, l); } }