【问题标题】:AOA USB connection issueAOA USB 连接问题
【发布时间】:2013-03-12 02:15:47
【问题描述】:

我一直在努力建立链接here中指定的USB连接并成功实现它。它的工作正常接受它经常断开连接。我从this 链接和this 链接了解到,android 操作系统中存在一个错误,即没有 USB 连接事件的广播事件。我已经实现了一个接收器,用于获取不太重要的 USB 断开事件。我还参考了this 链接以创建与 USB 的稳定连接,即在 USB 连接后开始数据通信而不会丢失任何数据。当应用程序中有单个活动或单个屏幕时,整个事情都可以正常工作。

对于多屏幕,此连接存在问题,即连接不稳定,我在应用程序中有多个屏幕,我可以随时在任何活动中通过 USB 接收数据。所以我有 2 个问题,如果可能的话,我正在寻找一些代码的答案

  1. 如何在多个屏幕上通过 android 中的串行 USB 连接的设备建立稳定的连接
  2. 如何摆脱多屏应用中频繁断线的问题

任何帮助都会很棒

编辑:

我正在添加我的服务,该服务负责与 USB 通信并启动一个线程以连续接收数据

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.hardware.usb.UsbManager;
import android.os.IBinder;
import arya.omnitalk.com.usb.R;
import arya.omnitalk.com.usb.constants.FileReadingWritingConstants;
import arya.omnitalk.com.usb.constants.GeneralConstant;
import arya.omnitalk.com.usb.constants.UsbDataWriterConstants;

import com.hoho.android.usbserial.driver.UsbSerialProber;

public class UsbCommunicationService extends Service{

    public static ArrayList<String> _dataArray = new ArrayList<String>();
    private Thread mCommunicationThread = null;

    private class ReadThread implements Runnable {
        @Override
        public void run() {

            while (mCommunicationThread!= null && !mCommunicationThread.isInterrupted()) {

                // Here I write code to parse data received via USB

                 }          
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();

        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); // Creating object of usb manager
        UsbDataWriterConstants.driver = UsbSerialProber.acquire(manager); // Acquiring usb channel

        if (UsbDataWriterConstants.driver != null) {
            try {
                UsbDataWriterConstants.driver.open();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            try {
                ReadThread mReadThread = new ReadThread();
                mCommunicationThread = new Thread(mReadThread);
                mCommunicationThread.start();
            } catch (SecurityException e) {
                DisplayError(R.string.error_security);
                DisplayError(R.string.error_security);
            }
        }

    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        if (mCommunicationThread != null)
            mCommunicationThread.interrupt();
        super.onDestroy();
    }


}

【问题讨论】:

  • 您可以通过几种不同的方式进行操作。我建议您创建一个处理 USB 连接的服务,并让您的活动通过您的服务与 USB 通信。
  • @Leco 我目前正在做那件事,但是一旦 USB 再次连接,它就会再次创建实例,我没有获取数据,因为我持有旧实例
  • 没有看到你的代码来理解你的应用程序逻辑,想到的一件事是你可以让你不想在清单文件中重新实例化“singleTask”的活动的launchMode(android:活动标签下的launchMode="singleTask")。见developer.android.com/guide/topics/manifest/…
  • @Leco 我已经这样做了。检查我的编辑我添加了通过usb通信的服务代码
  • 你读过developer docs吗?不确定他们是否可以帮助任何人。另外,当我在多个屏幕上使用 AOA 时,我使用的片段是我的AOA_Activity extends Activity,然后是我的mainActivity extends AOA_Activity,然后我的不同片段通过mainActivity 进行通信。不确定这是否有帮助。

标签: java android usb


【解决方案1】:

这是我为我的 USB 配件注册的活动的代码。

    public class UsbAccessoryAttachedWorkaroundActivity extends Activity {

    /**
     * Used only to catch the USB_ACCESSORY_ATTACHED event, has it is not broadcasted to 
     * anything else than the activity with the right accessory_filter (no Service, nor Receiver...)
     * DETACHED event is broadcasted as other events. 
     */

     @Override
     public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             Intent intent = new Intent(this, UsbService.class);
             startService(intent);
             finish(); // <- die ASAP, without displaying anything.
     }
    }

通过这种方式,您可以获得所有 CONNECT 事件,因为 Activity 还没有存活 => 每次发现附件时,Android 都会重新启动它... 我的服务只有在没有人绑定到它时才会启动我的 HomeActivity。如果有人被绑定,则意味着 UI 已经存在,因此我只是通知我的听众 USB 连接已恢复...

【讨论】:

  • 感谢 Bonrry 的代码,但还有一个限制是我不能重新启动相同的活动,我必须在后台对一些不同的活动做这种事情:)。这就是我在提出的问题中要说的
【解决方案2】:

您可能会断开连接,因为您的服务只是绑定服务。 第一个活动启动,绑定到服务,然后将启动。 当您切换到另一个活动时,第一个活动会停止,因此它会解除绑定。此时,服务不再绑定,因此被杀死。 绑定服务在这里解释:http://developer.android.com/guide/components/bound-services.html

您需要的可能是在连接 USB 时保持服务运行。为此,您需要一个“持久”服务,一个已启动的服务,如下所述: http://developer.android.com/guide/components/services.html 您可以在收到 CONNECTED 事件的活动的 onCreate 中启动您的服务,使用:

public class HomeActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...
        Intent intent = new Intent(this, UsbCommunicationService.class);
        startService(intent);
        // ...
    }
}

UsbCommunicationService 将通过此方法启动(不推荐使用 onStart()):

public class UsbCommunicationService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // TODO : connect to USB...

        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.       
        return START_STICKY;
    }
}

接下来,您的所有活动都可以“绑定”、“取消绑定”和“重新绑定”到这个将继续存在的服务。 不要忘记在 DISCONNECT 事件上停止它,使用:

stopSelf(); // Will actually stop AFTER all clients unbind... 

【讨论】:

  • 请检查我的服务代码。我正在做你在这里展示的事情。它没有帮助
  • 您使用 onStart(Intent intent, int startId) 而不是 onStartCommand(...)。所以你不能返回START_STICKY,而且你的服务可能不是一个“已启动”+“绑定”的服务幸存......另外为了确保不被杀死,你的服务必须通过向状态栏添加通知来请求前台。
  • 在那张纸条上,我可以说我的服务一直在运行。其次,我在必要时停止和启动服务,并且在提供事件时我的服务启动和停止,因此没有与服务未启动或终止相关的问题
  • 如果我错了,请原谅我,但我认为这不是与服务相关的问题,请正确阅读我的问题并为我提供相应的答案。我完全了解服务及其功能,因此我正在搜索与 android 开放式附件及其缺陷消除技术相关的答案。当 USB 连接/断开时,我的服务在后台运行 100%。但我没有得到连接 USB 的事件,所以如何通过代码获取该事件
  • 是的,但是断开后USB没有连接,断开和重新连接后我无法接收数据
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多