- 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/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!