为什么只是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附件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));
}
}