Java AOA USB连接问题
我一直致力于在链接中指定USB连接,并成功地实现了它。它工作正常,但经常断开连接。我通过link和link了解到android操作系统中存在一个bug,即没有USB连接事件的广播事件。我已经实现了一个接收器,用于获取USB断开事件,这并不太重要。此外,我还参考链接创建与USB的稳定连接,即在USB连接后无任何损失地启动数据通信。当应用程序中只有一个活动或一个屏幕时,整个过程运行良好 对于多屏幕连接,该连接存在问题,即连接不稳定,我在应用程序中有多个屏幕,我可以在任何时间通过USB在任何活动中接收数据。所以我有两个问题,如果可能的话,我会用一些代码来寻找答案Java AOA USB连接问题,java,android,usb,Java,Android,Usb,我一直致力于在链接中指定USB连接,并成功地实现了它。它工作正常,但经常断开连接。我通过link和link了解到android操作系统中存在一个bug,即没有USB连接事件的广播事件。我已经实现了一个接收器,用于获取USB断开事件,这并不太重要。此外,我还参考链接创建与USB的稳定连接,即在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在男人身上显示出“单一任务”