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