Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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
C# 为什么连接USB时活动会崩溃_C#_Android_Xamarin_Usb_Ftdi - Fatal编程技术网

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));            
    }
}