AOA USB连接问题

时间:2013-03-22 09:21:10

标签: java android usb

我一直致力于在链接here中指定USB连接并成功实施。它的工作正常接受它经常断开连接。我从this链接和this链接知道android OS中存在一个错误,即没有USB连接事件的广播事件。我已经实现了一个接收器来获取USB断开事件,这并不是太重要。我还提到this链接以创建与USB的稳定连接,即在USB连接后开始数据通信而没有任何损失。在应用程序中有单个活动或单个屏幕时,整个过程正常。

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

  1. 如何在多个屏幕上通过串口USB连接设备与多个屏幕进行稳定连接
  2. 如何通过多个屏幕消除应用程序中频繁的断开连接问题
  3. 任何帮助都会很棒

    修改

    我正在添加负责与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();
        }
    
    
    }
    

2 个答案:

答案 0 :(得分:0)

您可能已断开连接,因为您的服务只是绑定服务。 第一个活动开始,绑定到服务,然后启动。 切换到另一个活动时,第一个活动停止,因此解除绑定。此时,服务不再受限制,因此它被杀死。 绑定服务在此解释: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... 

答案 1 :(得分:0)

以下是我的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事件,因为活动尚未生效=&gt; Android每次发现配件时重新启动它...... 只有在没有人受到约束的情况下,我的服务才会启动我的HomeActivity。如果某人被绑定,则意味着UI已经存在,因此我只是通知我的听众USB连接已经恢复...