2012-03-26 78 views
2

我花了好几天的时间试图让服务中运行的android ADK连接,而不是活动.....任何人都知道,如果它甚至可能?长时间运行ADK附件(服务?)

我想要服务处理inputStream和outputStream,这样我可以在后台读取我的Arduino长时间。

当活动返回焦点时,我将与服务绑定并更新GUI。如果这是可能的,我最终希望用服务中的实时数据更新网站以进行远程监控。

任何帮助,如果赞赏。我是编程新手,似乎无法找到有关此主题的更多信息。

谢谢advace寻求帮助。

回答

2
+1

感谢您的链接。我试图让服务在不使用“应用程序”对象的情况下运行。经过数周的努力,我现在被迫使用了robotgrrl的技术。好消息是它的工作!我仍在研究细节,但计划很快发布我的代码。让adk的东西在后台运行会增加处理配件连接/断开的复杂性。用户界面也必须以不同的方式处理。 – 2012-04-09 03:55:27

+0

好!以下链接是我自己的项目,它在github上使用长时间运行的ADK服务。该程序定期将传感器数据上传到维基页面,该程序还会读取wiki页面上的命令,并通过命令定期操作执行器。 https://github.com/takashiyamanoue/AdkWikiConnectorService。我们将有一个关于这个系统正在会议上发言,IIAI ESKM 2012,http://aai2012.iaiai.org/eskm2012/。希望这些信息能帮助你。 – 2012-07-19 00:33:56

0

您应该在主要活动(如here)中处理附件的加载,然后将对附件对象的引用传递给服务。

您现在可以绑定来自任何活动的服务并访问输入/输出流。

您也可以关闭活动,并且当您断开附件时,活动应该捕获意向广播并重新启动以执行closeAccessory例程。

+0

我不认为有可能只传递一个对服务的引用。我试过并收到一个空指针问题。我还尝试使用“put”将UsbAccessory包装到启动服务意图中,因为它不可分析,所以这不是一个选项。 – 2012-05-15 21:10:11

2

我能得到通过以下方式运行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断开的接收器,因此它可以,如果设备断开连接停止:的onCreate完成服务将调用onStartCommand的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(); 
} 

@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(); 


      } 
     } 
    }; 

连接的处理可能需要一些调整,但整体概念似乎工作。我希望这能帮助每个人!现在看起来很容易,但是我花了很长时间才到这里(我重复编程)