- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我工作过 the description and samples for USB host at developer.android.com检测连接和分离的 USB 设备。
如果我在连接设备时在 list 文件中使用 Intent 过滤器来启动我的应用程序,它可以正常工作:插入,检测到设备,android 请求启动应用程序的权限,设备信息显示在一张 table 。
我正在开发的应用程序不应仅在连接/分离设备时启动/完成(例如数据管理目的)。如果应用程序已经在运行,我也不希望打开对话框弹出。因此,我决定如果连接了设备,则不直接启动 Activity ,而是注册一个 BroadcastReceiver,它(稍后)应该在设备处于/分离状态时通知 Activity 。这个接收器可以很好地识别分离 Action ,但不能识别附加 Action 。
我是否缺少权限或数据属性或类似的东西?教程和示例没有说明额外的必要属性。
这是 list 文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="de.visira.smartfdr"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="12" />
<uses-feature android:name="android.hardware.usb.host" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".usb.Detector">
<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" />
</receiver>
</application>
接收者:
public class FDRDetector extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, "Action: " + action, 3).show();
// pops up only if action == DETACHED
}
我不明白为什么相同的 Intent 过滤器可以工作,如果我在 Activity 上使用它们,但如果它们应用于接收器则不行?即使我在代码中设置了接收器和过滤器,也无法识别附件。
我的工作环境:IDE:带有 Android 插件的 Eclipse 3.7
设备:Acer Iconia Tab A500
安卓:3.1
提前致谢
最佳答案
啊哈!我想到了。我遇到了完全相同的问题。
它的要点是 - 如果您在插入设备时自动启动您的应用程序(使用 list 文件),那么看起来 Android 系统 获得了 ACTION_USB_DEVICE_ATTACHED Intent ,然后因为它知道您的应用程序想要在这种情况下运行,它实际上向您的应用程序发送 android.intent.action.MAIN Intent 。它从不向您的应用程序发送 ACTION_USB_DEVICE_ATTACHED 操作,因为它认为它已经知道您的应用程序在这种情况下想要做什么。
我刚刚发现了问题,我想我有一个解决方案,但我可以告诉你我发现了什么:
即使您的应用程序正在运行并且在前台,当您插入 USB 设备并且 Android 系统获取 ACTION_USB_DEVICE_ATTACHED Intent 时,它也会在您的 Activity 中调用 onResume()。
很遗憾,您不能这样做:
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
//do something
}
}
因为 Intent 将以 android.intent.action.MAIN 的形式返回,而不是 ACTION_USB_DEVICE_ATTACHED。
如果您只是离开应用程序,但不拔掉 USB,您也会得到 android.intent.action.MAIN,这很烦人。我想让设备进入休眠状态并重新唤醒它会做同样的事情。
所以根据我的发现,您无法直接获得 Intent ,但似乎您可以依赖在插入 USB 设备时调用 onResume(),因此解决方案是检查以查看如果每次收到 onResume 时都连接了 USB。您还可以在 USB 断开连接时设置一个标志,因为 USB 断开连接 Intent 当然可以正常触发。
所以总的来说,您的广播接收器可能如下所示:
// BroadcastReceiver when remove the device USB plug from a USB port
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
usbConnected=false;
}
}
};
你会在 onCreate 里面有这个:
// listen for new devices
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUsbReceiver, filter);
这位于 list 中的 Activity 标签内:
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
您的/res/xml/文件夹中将有一个 device_filter.xml 文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1027" product-id="24577" />
<usb-device vendor-id="1118" product-id="688" />
</resources>
(当然可以使用您需要的任何供应商 ID 和产品 ID)
然后你的 onCreate 看起来像这样:
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
if (usbConnected==false ) {
//check to see if USB is now connected
}
}
我没有用于检查 USB 是否已连接的特定代码,因为我实际上还没有深入研究。我正在使用一个可以连接的库,所以对于我的应用程序,我可以启动那个循环,我很好。
将 list 中 Activity 的启动模式设置为“singleTask”也很重要,以防止它在已经运行时再次运行,否则插入 USB 设备只会启动应用程序的第二个实例!
所以我的 list 中的整个 Activity 标签如下所示:
<activity
android:label="@string/app_name"
android:name="com.awitness.common.TorqueTablet"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
>
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
无论如何,我希望这对某人有所帮助!我很惊讶我已经无法找到解决方案!
关于java - Android 3.1 USB-Host - BroadcastReceiver 不接收 USB_DEVICE_ATTACHED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981736/
Windows“主机”文件编码是什么?是UTF-8吗?还是 ASCII + 系统代码页?应如何添加 IDN(带有变音符号等的国际域名)条目以及它们是否可以添加? 最佳答案 它应该是没有 BOM 的 A
我已经在谷歌上搜索了大约 90 分钟,但仍然没有答案。在哪里设置 default_url_options?我已经将其设置为 config.action_mailer.default_url_optio
我正在从它的样式文件中设计一个 Angular 组件,我发现我必须使用 :host ,:host() 或 :host-context selector ,它们各自有什么不同? 最佳答案 :主机 是用于
我正在创建简单的网络应用程序。而且我在服务器配置方面遇到了问题。当我尝试启动服务器时,收到错误消息 The element type "Host"must be terminated by the m
这个有效: 127.0.0.1 www.somesite.com 但不是这个: 127.0.0.1/somepath/www www.mysite.com 我做错了什么?是否可
我必须查看我的前同事留下的一些脚本,我很好奇为什么他在参数中使用 $a = $(Read-Host -Prompt "Write Something")节而不是 $a = (Read-Host -Pr
我在远程连接到 MySQL 服务器时遇到问题。我知道我的用户设置了来自任何主机的“%”通配符,因此我应该有权访问服务器。我可以使用我的凭据本地登录 MySQL 服务器,但不能远程登录。 我在 my.c
我正在尝试使用 angular 2 构建一个双主题应用程序。有问题的组件 css 已经使用 :host/deep/强制对子组件进行样式设置。 但是我正在尝试根据 html 主题切换此样式,并且我正在使
我需要将特定的传出连接(从我系统上的任何 网络客户端)重定向到特定的 IP。是的,可以通过在 /etc/hosts 文件中添加这一行来完成: 123.456.789.012 www.mydomain
尝试在开发中预览我的邮件程序,但出现上述错误。(使用 Michael Hartl 教程)。 我相信它因为我的主机而无法正常工作。但是,使用 cloud 9 我很难找到我的主机。在书中,它被定义为 Cl
nc 当我在虚拟机上执行它时工作正常。 Connection to 10.0.0.10 22 port [tcp/ssh] succeeded! 但是当我在 docker 容器内执行相同的命令时,它会
我正在学习PowerShell,想知道两者之间的区别 Read-Host -Prompt "Text" 和 Read-Host "Text" 是同一件事还是我没有看到的区别? 最佳答案 这是同一件事。
我无法对 Cassandra 节点进行查询。我能够连接到集群并进行连接。然而,在执行查询时,它失败了 Caused by: com.datastax.driver.core.exceptions.No
我有这样的场景,比如我需要运行一个位于 12.34.567 的 API curl 请求,登录后我必须再登录一台主机 98.76.543。 登录到第二个主机后,我必须运行curl -XPOST -H"C
当我尝试 git push -u origin master到我的存储库,我得到 400 Bad Request .我特意用 编辑了一些信息。 最近从 gitlab-ee 中解绑了 nginx,并验
假设我有某个程序的源代码,源代码使用 GNU autotools,为了简单起见,假设该程序绝不是任何类型的开发工具。如果我手边有交叉工具链,我可以使用 --host configure 为平台 foo
在我的 ASP.NET Core 2.0 项目中,我一直在使用 Microsoft.Extensions.Hosting 命名空间中的 IHostingEnvironment 和 IApplicati
我正在使用以 Python3.6 为基础的 docker 镜像。突然间它开始崩溃(启动后立即退出)。所以我冲进了容器,发现它崩溃是因为与容器化 postgres 数据库的连接突然失败。我设法得到的唯一
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我尝试使用 ssh命令连接到另一个远程主机。 ssh -p 21098 -i $OPENSHIFT_DATA_DIR/.ssh/host_key user@domain.com The authe
我是一名优秀的程序员,十分优秀!