C# 为什么连接USB时活动会崩溃
我创建了一个简单的C# 为什么连接USB时活动会崩溃,c#,android,xamarin,usb,ftdi,C#,Android,Xamarin,Usb,Ftdi,我创建了一个简单的活动,通过将USB设备连接/分离到我的安卓平板电脑来测试意图的传入。我启动活动并尝试连接USB,这时弹出错误“应用程序…停止工作”。出现。当我在连接了USB电缆的情况下启动应用程序,然后尝试断开USB时,也会出现同样的情况 提示:此示例仅用于测试。我需要编写一个服务,该服务将通过USB自动从设备接收数据,并将数据上传到服务器(此部分已经运行)。现在我要处理的是如何自动启动服务,当USB设备连接时,我会想到最好的方法 考虑事项1:问题可能是安装过滤器的错误方式?系统将意图发送给接
活动
,通过将USB
设备连接/分离到我的安卓平板电脑来测试意图
的传入。我启动活动
并尝试连接USB
,这时弹出错误“应用程序…停止工作”。出现。当我在连接了USB
电缆的情况下启动应用程序,然后尝试断开USB
时,也会出现同样的情况
提示:此示例仅用于测试。我需要编写一个服务
,该服务将通过USB
自动从设备接收数据,并将数据上传到服务器(此部分已经运行)。现在我要处理的是如何自动启动服务
,当USB
设备连接时,我会想到最好的方法
考虑事项1:问题可能是安装过滤器的错误方式?系统将意图发送给接收器,他想处理它,但没有找到设备\u过滤器,然后坠落?我尝试路径:TestUSB.xml.device\u filter.xml或TestUSB.Resources.xml.device\u filter.xml,但没有成功
考虑事项2:AndroidManifest.xml配置不正确,缺少一些权限
考虑事项3:平板电脑/操作系统是否存在问题?目前我有一个不同的硬件来测试它
我使用的是平板电脑alps 874v3安卓4.4.2,USB设备是我们使用FTDI芯片的专用硬件
我使用VisualStudio2010和Xamarin在.net中编写Android应用程序
[Activity(Label = "TestUSB", MainLauncher= true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = 0;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
Button button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
}
}
public class UsbBroadcastReceiver : BroadcastReceiver
{
public UsbBroadcastReceiver()
{
}
public override void OnReceive(Context context, Intent intent)
{
InvokeAbortBroadcast();
}
}
由VS+Xamarin生成的AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="TestUSB.TestUSB" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="11" />
<application android:label="TestUSB" android:icon="@drawable/icon" android:name="mono.android.app.Application" android:debuggable="true">
<receiver android:enabled="true" android:exported="true" android:name=".UsbBroadcastReceiver" android:launchMode="singleTask">
<uses-feature android:name="android.hardware.usb.host" android:required="false" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
<!--<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" />-->
</receiver>
<activity android:icon="@drawable/icon" android:label="TestUSB" android:name="md537e255c671aa66f9ada9a57df4bd0038.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
</activity>
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="TestUSB.TestUSB.mono.MonoRuntimeProvider.__mono_init__" />
<receiver android:name="mono.android.Seppuku">
<intent-filter>
<action android:name="mono.android.intent.action.SEPPUKU" />
<category android:name="mono.android.intent.category.SEPPUKU.TestUSB.TestUSB" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
考虑到这种抽象形式: 下面的列表描述了在使用USB accesory API之前需要添加到应用程序清单文件中的内容。清单和资源文件 示例显示了如何声明这些项: 因为并不是所有Android驱动的设备都能保证支持 USB附件API,包括声明 您的应用程序使用android.hardware.usb.accessory功能。 如果使用的是加载项库,请添加元素 为库指定com.android.future.usb.accessory。设定 如果您使用 如果您使用的是android.hardware.usb,请使用附加库或12 包裹 和管理为过滤器USB连接/分离:
<activity ...>
...
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
...
问题在于系统错误地找到了接收器。
Xamarin
项目注册接收者/活动未在AndroidManifest.xml中,但必须将相关类注册为属性。
[BroadcastReceiver(Enabled=true,Exported=true,Permission="android.permission.USB_PERMISSION")]
[UsesLibrary("android.hardware.usb.host", Required = true)]
[MetaData("android.hardware.usb.action.USB_DEVICE_ATTACHED", Resource = "@xml/device_filter")]
[MetaData("android.hardware.usb.action.USB_DEVICE_DETACHED", Resource = "@xml/device_filter")]
[IntentFilter(new string[] { "android.hardware.usb.action.USB_DEVICE_ATTACHED", "android.hardware.usb.action.USB_DEVICE_DETACHED" })]
public class UsbBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent != null) Log.Debug("testusb", string.Format("OnReceive - {0} ", intent.Action));
}
}
您没有此错误的任何崩溃日志吗?在这种情况下,你的调试器不会因为一些异常而停止吗?我没有任何日志,因为测试中的android没有连接到PC。并且从较新的android版本-aLogCat无法处理来自其应用程序外部的消息。我尝试将登录代码写入文件,但代码在到达之前崩溃。崩溃后,您始终可以从设备获取系统日志。请看:然后只需搜索神奇的单词“dead”(前面有您的包名),您就可以得到stacktrace了。谢谢您提供的信息。我在问题中添加了日志。日志中有关于接收器的不存在类的警告。我在androidmanifest中注册receiver,但不注册活动。在VS+xamarin中,活动由xamarin自动填入androidManifest并更改其名称。问题可能在那里?我添加了由xamarin生成的AndroidManifest。xamarin具有属性[BroadcastReceiver]-将其放置在UsbBroadcastReceiver之上,以便xamarin在构建过程中注册它。您可能还想使用[IntentFilter]属性,请参阅xamarin上的documentaction/示例
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="TestUSB.TestUSB" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="11" />
<application android:label="TestUSB" android:icon="@drawable/icon" android:name="mono.android.app.Application" android:debuggable="true">
<receiver android:enabled="true" android:exported="true" android:name=".UsbBroadcastReceiver" android:launchMode="singleTask">
<uses-feature android:name="android.hardware.usb.host" android:required="false" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
<!--<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" />-->
</receiver>
<activity android:icon="@drawable/icon" android:label="TestUSB" android:name="md537e255c671aa66f9ada9a57df4bd0038.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
</activity>
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="TestUSB.TestUSB.mono.MonoRuntimeProvider.__mono_init__" />
<receiver android:name="mono.android.Seppuku">
<intent-filter>
<action android:name="mono.android.intent.action.SEPPUKU" />
<category android:name="mono.android.intent.category.SEPPUKU.TestUSB.TestUSB" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
<activity ...>
...
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
[BroadcastReceiver(Enabled=true,Exported=true,Permission="android.permission.USB_PERMISSION")]
[UsesLibrary("android.hardware.usb.host", Required = true)]
[MetaData("android.hardware.usb.action.USB_DEVICE_ATTACHED", Resource = "@xml/device_filter")]
[MetaData("android.hardware.usb.action.USB_DEVICE_DETACHED", Resource = "@xml/device_filter")]
[IntentFilter(new string[] { "android.hardware.usb.action.USB_DEVICE_ATTACHED", "android.hardware.usb.action.USB_DEVICE_DETACHED" })]
public class UsbBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent != null) Log.Debug("testusb", string.Format("OnReceive - {0} ", intent.Action));
}
}