Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AOA USB连接问题_Java_Android_Usb - Fatal编程技术网

Java AOA USB连接问题

Java AOA USB连接问题,java,android,usb,Java,Android,Usb,我一直致力于在链接中指定USB连接,并成功地实现了它。它工作正常,但经常断开连接。我通过link和link了解到android操作系统中存在一个bug,即没有USB连接事件的广播事件。我已经实现了一个接收器,用于获取USB断开事件,这并不太重要。此外,我还参考链接创建与USB的稳定连接,即在USB连接后无任何损失地启动数据通信。当应用程序中只有一个活动或一个屏幕时,整个过程运行良好 对于多屏幕连接,该连接存在问题,即连接不稳定,我在应用程序中有多个屏幕,我可以在任何时间通过USB在任何活动中接收

我一直致力于在链接中指定USB连接,并成功地实现了它。它工作正常,但经常断开连接。我通过link和link了解到android操作系统中存在一个bug,即没有USB连接事件的广播事件。我已经实现了一个接收器,用于获取USB断开事件,这并不太重要。此外,我还参考链接创建与USB的稳定连接,即在USB连接后无任何损失地启动数据通信。当应用程序中只有一个活动或一个屏幕时,整个过程运行良好

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

  • 如何在多个屏幕上与android中通过串行USB连接的设备建立稳定连接
  • 如何在多个屏幕的应用程序中消除这种频繁断开连接的问题
  • 任何帮助都将是巨大的

    编辑:

    我正在添加我的服务,该服务负责与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();
        }
    
    
    }
    
    import java.io.IOException;
    导入java.util.ArrayList;
    导入java.util.array;
    导入android.app.AlertDialog;
    导入android.app.Service;
    导入android.content.Context;
    导入android.content.DialogInterface;
    导入android.content.DialogInterface.OnClickListener;
    导入android.content.Intent;
    导入android.hardware.usb.UsbManager;
    导入android.os.IBinder;
    导入arya.omnitalk.com.usb.R;
    导入arya.omnitalk.com.usb.constants.FileReadingWritingConstants;
    导入arya.omnitalk.com.usb.constants.GeneralConstant;
    导入arya.omnitalk.com.usb.constants.UsbDataWriterConstants;
    导入com.hoho.android.usbserial.driver.UsbSerialProber;
    公共类UsbCommunicationService扩展服务{
    公共静态ArrayList_dataArray=new ArrayList();
    私有线程mCommunicationThread=null;
    私有类ReadThread实现可运行{
    @凌驾
    公开募捐{
    while(mCommunicationThread!=null&!mCommunicationThread.isInterrupted()){
    //这里我编写代码来解析通过USB接收的数据
    }          
    }
    }
    @凌驾
    public void onCreate(){
    super.onCreate();
    UsbManager manager=(UsbManager)getSystemService(Context.USB_SERVICE);//正在创建USB管理器的对象
    UsbDataWriterConstants.driver=UsbSerialProber.acquire(管理器);//获取usb通道
    if(UsbDataWriterConstants.driver!=null){
    试一试{
    UsbDataWriterConstants.driver.open();
    }捕获(IOE1异常){
    e1.printStackTrace();
    }
    试一试{
    ReadThread mrreadthread=新的ReadThread();
    mCommunicationThread=新线程(mReadThread);
    mCommunicationThread.start();
    }捕获(安全异常e){
    显示错误(R.string.error\u security);
    显示错误(R.string.error\u security);
    }
    }
    }
    @凌驾
    公共无效启动(Intent Intent,int startId){
    super.onStart(intent,startId);
    }
    @凌驾
    公共IBinder onBind(意向){
    返回null;
    }
    @凌驾
    公共空间{
    如果(mCommunicationThread!=null)
    mCommunicationThread.interrupt();
    super.ondestory();
    }
    }
    
    您可能已断开连接,因为您的服务只是绑定服务。 第一个活动启动,绑定到服务,然后服务将启动。 当您切换到另一个活动时,第一个活动将停止,因此它将解除绑定。此时,服务不再绑定,因此它被终止。 绑定服务的解释如下:

    您需要的可能是在连接USB的情况下保持服务运行。要实现这一点,您需要一个“持久”服务,一个已启动的服务,如下所述: 您可以在接收连接事件的活动的onCreate中启动服务,使用:

    public class HomeActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            // ...
            Intent intent = new Intent(this, UsbCommunicationService.class);
            startService(intent);
            // ...
        }
    }
    
    stopSelf(); // Will actually stop AFTER all clients unbind... 
    
    UsbCommunicationService将通过此方法启动(onStart()已弃用):

    接下来,您的所有活动都可以“绑定”、“解除绑定”和“重新绑定”到此将继续存在的服务。 不要忘记在发生断开连接事件时停止,请使用:

    public class HomeActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            // ...
            Intent intent = new Intent(this, UsbCommunicationService.class);
            startService(intent);
            // ...
        }
    }
    
    stopSelf(); // Will actually stop AFTER all clients unbind... 
    

    这是我为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.
         }
        }
    
    公共类UsbAccessoryAttachedWorkaroundActivity扩展活动{
    /**
    *仅用于捕获USB_附件_连接的事件,它不会广播到
    *除使用右附件过滤器的活动之外的任何活动(无服务,也无接收器…)
    *分离的事件与其他事件一样广播。
    */
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Intent Intent=新Intent(这个,UsbService.class);
    startService(意向);
    finish();//每次发现附件时,Android都会重新启动它。。。
    
    只有当没有人绑定到我的服务时,我的服务才会启动我的HomeActivity。如果有人绑定了,这意味着已经存在一个UI,因此我只是通知我的听众USB连接已恢复…

    您可以使用几种不同的方法来进行操作。我建议您创建一个处理USB连接的服务,并让您的活动进行通信通过您的服务使用USB。@Leco我目前正在做这件事,但一旦USB再次连接,它就会再次创建实例,而我不会获取数据,因为我持有旧实例,而没有看到您的代码来理解您的应用程序逻辑,我想到的一件事是,您可以使您不想要的活动的启动模式rei在男人身上显示出“单一任务”