2011-11-01 3 views
4

저는 Android Open Accessory Development Kit를 가지고 놀았습니다. the DemoKit example provided by Google을 따라하면 솔루션을 내 응용 프로그램에 적용하는 데 아무런 문제가 없었습니다. 액세서리를 감지하고 통신하고 분리 할 수 ​​있습니다.Android Open Accessory 모드를 서비스로 구현하는 방법은 무엇인가요?

그러나 모든 것을 서비스로 실행해야합니다. USB_ACCESSORY_ATTACHED 인 텐트 (즉, 액세서리가 연결될 때)에 의해 실행되는 기본 활동이 있으며 정상적으로 작동합니다. 그러나 서비스를 시작하고 정기적 인 작업 내에서 내 작업 솔루션에 비해 동일한 코드를 실행하자마자 액세서리와 통신하려고 할 때마다 IOException ("해당 기기 없음")을 수신합니다 (모니터링 arduino 측면에는 성공적인 USB 연결이 표시됨). 이것은 서비스 내에서 올바른 BroadcastReceiver를 지정하고 onStartCommand 콜백 메소드에 등록한 다음 openAccessory()으로 통신 끝점을 설정하더라도 발생합니다. 관련 코드는 다음과 같습니다.

@Override 
public void onCreate() { 
    Log.d(TAG, "ONCREATE"); 

    manager = UsbManager.getInstance(this); 
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
      ACTION_USB_PERMISSION), 0); 

    // Register broadcastreceiver for filtering accessory events 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); 
    registerReceiver(mUsbReceiver,filter); 
    super.onCreate(); 
} 

public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d(TAG, "ONSTARTCOMMAND METHOD ACCESSED"); 

    if (mInputStream != null && mOutputStream != null) { 
     return START_NOT_STICKY; 
    } 

    UsbAccessory[] accessories = manager.getAccessoryList(); 
    mAccessory = (accessories == null ? null : accessories[0]); 

    if (mAccessory != null) { 
     if (manager.hasPermission(mAccessory)) { 
      openAccessory(); 
     } else { 
      synchronized (mUsbReceiver) { 
       if (!mPermissionRequestPending) { 
        manager.requestPermission(mAccessory, 
          mPermissionIntent); 
        mPermissionRequestPending = true; 
       } 
      } 
     } 
    } else { 
     Log.d(TAG, "mAccessory is null"); 
    } 
    return START_NOT_STICKY; 
} 

openAccessory 방법 : 가능한 솔루션에 대한

/** 
* Open the accessory 
*/ 
private void openAccessory() { 
    Log.d(TAG, "openAccessory: "+mAccessory); 
    mFileDescriptor = manager.openAccessory(mAccessory); 
    if (mFileDescriptor != null) { 
     FileDescriptor fd = mFileDescriptor.getFileDescriptor(); 
     mInputStream = new FileInputStream(fd); 
     mOutputStream = new FileOutputStream(fd); 
     Thread thread = new Thread(null,this,"AccessoryThread"); 
     thread.start(); 
    } 
} 

어떤 아이디어?

답변

3

해결책은 간단했습니다. 의도는 액세서리 ADK 구현 요구 사항의 세부 사항을 포함하고 있기 때문에

if (intent.getAction().equals(USB_ACCESSORY_ATTACHED)) { 
    Intent i = new Intent(this, YourServiceName.class); 
    i.putExtras(intent); 
    startService(i); 
} 

기본적으로,이 서비스를 시작하는 데 사용하는 활동을 시작할 때받은 의도를 복사합니다.

그런 다음 서비스에서 이전과 똑같이 ADK의 나머지 부분을 구현하십시오.

0

현재로서는 문제와 일치하는 해결책을 드릴 수 없습니다. 하지만 this github example이 문제를 해결하는 방법을 보여줄 수 있습니다.

github에 주어진 코드를 분석하여 수행하려는 작업과 동일한 작업을 수행 할 것입니다.

+1

위 참조 - 해결책을 찾았습니다. –