为什么只是USB连接时活动崩溃

本文关键字:活动 崩溃 连接 USB 为什么 | 更新日期: 2023-09-27 18:00:12

我创建了一个简单的activity,通过将USB设备连接/分离到我的android平板电脑中来测试intent的传入。我启动activity并尝试连接USB,此时出现错误"application….stopped working."。当我在连接USB电缆的情况下启动应用程序,然后尝试断开USB时,也会出现同样的情况。

提示:此示例仅用于测试。我需要编写一个service,它将通过USB自动接收来自设备的数据,并将其上传到服务器(这部分已经可以操作了)。现在我来处理如何自动启动service,最好的会在USB设备连接的那一刻出现。

注意事项1:问题可能是device_filter的方法错误?系统将意向发送给接收者,他想处理它,但找不到device_filter和than fall?我尝试了路径:TestUSB.xml.device_filter.xml或TestUSB.Resources.xml.device_filter.xml,但没有成功。

考虑2:AndroidManifest.xml配置错误,缺少一些权限?

考虑3:或者平板电脑/OS出现问题?目前我有一个不同的硬件来测试它

我使用的是平板电脑alps 874v3安卓4.4.2和USB设备是我们的专用硬件,带有FTDI芯片。

我使用Visual studio 2010和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();            
        }
    }

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" android:installLocation="auto">
        <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="19" />
        <application android:label="TestUSB" android:icon="@drawable/Icon" android:launchMode="singleTask">
            <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" />
            </receiver>
        </application>
</manifest>

device_filter.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <!--<usb-device vendor-id="0403" product-id="6001" /> FTDI FT232R UART in hexa-->
  <usb-device vendor-id="1027" product-id="24577" /><!--FTDI FT232R UART in decimal-->
</resources>

**编辑:**我又借了一部华为的新手机,在那里试了一下。它的作用就像平板电脑

实际LOG

 D/ActivityManager(  654): AP_PROF:AppLaunch_LaunchTime:TestUSB.TestUSB/md537e255c671aa66f9ada9a57df4bd0038.MainActivity:1104:3576760
    D/ActivityManager(  654): ACT-IDLE_NOW_MSG from windowsVisible() for idle: ActivityRecord{41fd3280 u0 TestUSB.TestUSB/md537e255c671aa66f9ada9a57df4bd0038.MainActivity t33}
    W/UsbSettingsManager(  654): no meta-data for ResolveInfo{4266c658 TestUSB.TestUSB/md537e255c671aa66f9ada9a57df4bd0038.MainActivity m=0x108000}

W/System.err( 7880): java.lang.RuntimeException: Unable to instantiate receiver 
    TestUSB.TestUSB.UsbBroadcastReceiver: java.lang.ClassNotFoundException: 
    Didn't find class "TestUSB.TestUSB.UsbBroadcastReceiver" on path:
     DexPathList[[zip file "/data/app/TestUSB.TestUSB-1.apk"],nativeLibraryDirectories=[/data/app-lib/TestUSB.TestUSB-1,
    /vendor/lib, /system/lib]]

AndroidManifest.xml由VS+Xamarin:生成

<?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连接时活动崩溃

考虑到这种抽象形式的官方文档:

下面的列表描述了在使用USB附件API之前需要添加到应用程序清单文件中的内容。清单和资源文件示例显示了如何声明这些项目:

因为并非所有安卓设备都能保证支持USB附件API,包括一个声明您的应用程序使用android.hardware.usb.accessory功能。如果您正在使用加载项库,请添加元素为库指定com.android.future.usb.accessory。设置如果您正在使用附加库或12,如果您正在使用android.hardware.usb包裹

以及作为过滤器管理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));            
    }
}