Долгосрочный ADK Accessory (Сервис?) - PullRequest
2 голосов
/ 26 марта 2012

Я потратил несколько дней, пытаясь установить соединение Android ADK в службе, а не в деятельности ..... Кто-нибудь знает, возможно ли это вообще?

Я бы хотел, чтобы служба обрабатывала inputStream и outputStream, чтобы я мог читать Arduino в течение продолжительных периодов в фоновом режиме.

Когда действие вернется в фокус, я свяжусь с сервисом и обновлю графический интерфейс. Если это возможно, я бы в конечном итоге хотел бы обновить веб-сайт живыми данными из службы удаленного мониторинга.

Любая помощь, если ценится. Я новичок в программировании и не могу найти много информации по этой теме.

Спасибо заранее за помощь.

Ответы [ 3 ]

2 голосов
/ 22 августа 2013

Мне удалось установить соединение ADK следующим образом (не полный код. Только основные строительные блоки):

Во-первых, у меня есть действие, которое получает намерения ADK (служба системы Android базируется на метаданных ADK и манифесте).

private static final String USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getIntent().getAction() != null && getIntent().getAction().equals(USB_ACCESSORY_ATTACHED)) {
        Intent service = new Intent(this, ADKservice.class);
        service.putExtras(getIntent());
        startService(service);

        Intent launch = new Intent(this, MainActivity.class);
        launch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(launch);
    }
    this.finish();
}

Если намерение совпадает со строкой adk, оно запустит службу adk и передаст информацию о намерениях службе, запустит действие пользовательского интерфейса и завершит свою работу.

Пользовательский интерфейс (MainActivity) теперь привязывается к услуге, как и любая другая служба, поэтому он может вызывать публичные методы и / или получать данные через обратные вызовы службы (также могут использоваться локальные широковещательные сообщения).

ADKservice расширяет Runnable для мониторинга USB-соединения. Он также регистрирует приемник для отключения ADK, поэтому он может остановиться, если устройство отключается:

@Override
public void onCreate() {

    IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
    registerReceiver(mUsbReceiver, filter);


    mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

     mBuilder = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.ic_launcher)
    .setContentTitle("ADK Service")
    .setContentText("Started");
    startForeground(notifyID, mBuilder.build());

    super.onCreate();
}

После завершения onCreate служба вызовет onStartCommand, где начинается инициализация adk.

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartup " + mAccessory );

        mAccessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
        if (mAccessory != null) {
            openAccessory(mAccessory);              
        }

        return super.onStartCommand(intent, flags, startId);
    }

private void openAccessory(UsbAccessory accessory) {
    Log.d(TAG, "openAccessory: " + accessory);
    UsbManager mUsbManager = (UsbManager) getApplicationContext().getSystemService(Context.USB_SERVICE);
    mFileDescriptor = mUsbManager.openAccessory(accessory);
    if (mFileDescriptor != null) {
        FileDescriptor fd = mFileDescriptor.getFileDescriptor();
        mInputStream = new FileInputStream(fd);
        mOutputStream = new FileOutputStream(fd);
        thread = new Thread(null, this, "ADKserviceThread");
        thread.start(); // start runnable
    }

public void run() {
 // handle adk "usb" messages here
}

    @Override
public void onDestroy() {
    closeAccessory();

    stopForeground(true);
    super.onDestroy();
}

private void closeAccessory() {
    try {
        if (mFileDescriptor != null) {
            mFileDescriptor.close();
        }
    } catch (IOException e) {
    } finally {
        mFileDescriptor = null;
        mAccessory = null;
    }
}

    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)) {
                closeAccessory();

            stopSelf();


            }
        }
    };

Для обработки соединения могут потребоваться некоторые настройки, но общая концепция, похоже, работает. Я надеюсь, что это помогает всем! Это кажется легким сейчас, но это заняло у меня много времени здесь (я постоянно новичок в программировании)

2 голосов
/ 07 апреля 2012

Я тоже пробую это и узнал это.http://robotgrrl.com/blog/2011/11/29/android-adk-background-service/

0 голосов
/ 11 апреля 2012

Вы должны обработать загрузку аксессуара в основном действии, как здесь , а затем передать ссылку на объект аксессуара в сервис.

Теперь вы можете привязать сервис излюбое действие и получить доступ к потокам ввода / вывода.

Вы также можете закрыть действие, и когда вы отключите аксессуар, действие должно перехватить широковещательную рассылку намерений и перезапустить для выполнения процедуры closeAccessory.

...