usb附件,通过Service的intent-filter捕获USB_ACCESSORY_ATTACHED

时间:2012-06-19 09:39:59

标签: android usb

在android usb附件documentation中,有一个android manifest的例子,其中Activity通过intent-filter捕获USB_ACCESSORY_ATTACHED。我问自己,有可能通过Service / IntentService的intent-filter捕获相同的意图吗?

修改

我试过了,但没有成功:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.entreprise.ws.main"
    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"

        >
            <activity
            android:name="com.entreprise.ws.main.WeatherStationClientActivity"
            android:exported="true"
            android:screenOrientation="portrait"
             >
<!--              <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>  -->

        </activity>

        <activity android:name=".EntryPointActivity"

            android:screenOrientation="portrait" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

            <activity
            android:name="com.entreprise.ws.main.WiFiListActivity"
            android:label="@string/appname_wifilist" >
            </activity> 


            <uses-library android:name="com.android.future.usb.accessory" />


         <activity
            android:screenOrientation="portrait"
            android:name=".WSInstallatorActivity"
            android:exported="true"
             >



        </activity> 

    <service class="services.MyService" android:name="services.MyService">
                     <intent-filter>
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
        </intent-filter>

                                <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                android:resource="@xml/accessory_filter" />
    </service>




    </application>

</manifest>

服务:

package services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

    final static String TAG = "MyService";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("TAG", "onCreate");
        Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("TAG", "onDestroy");
        Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("TAG", "onBind");
        // TODO Auto-generated method stub
        return null;
    }
}

P.S for activity,这很好用

EDIT2

我通过将intent-filter和元数据移动到我的广播接收器来进行实验:I 没有收到任何附加活动。有趣的是,我继续收到 分离事件。 它看起来像USB_ACCESSORY_ATTACHED只适用于活动, 尽管文档中有“广播行动”分类。

EDIT3:最终结论

看起来像USB_ACCESSORY_ATTACHED只能在活动中捕获(因为可能与用户对话?)。分离事件可以在接收器中捕获。

4 个答案:

答案 0 :(得分:4)

我也正在为我的项目探索Android上的USB支持,并最终浏览了Android源代码。

是USB_ACCESSORY_ATTACHED和USB_DEVICE_ATTACHED两个意图只能在活动中捕获但不在服务中。我还没找到确切原因。和你一样,我相信应该可以直接通知服务有关USB状态(设备连接,附件附件)。但这不是它在Android中的实现方式。如果我发现更多内容,我会发布。

可以在BroadCastReceivers中捕获分离意图。

如果你想在Android源码中冒险,你可以从这个目录开始 - ICS_SOURCE / frameworks / base / services / java / com / android / server / usb 并从那里阅读。

答案 1 :(得分:1)

是的,应该是可能的。如果您查看<service>文档,可以看到Service中的Manifest元素与<intent-filter>一样Activity

如果您查看USB_ACCESSORY_ATTACHED行动,则无法提及这不适用于Service

如果你看一下SEARCH_LONG_PRESS行动,就会提到:

  

活动操作:开始与长按搜索键相关联的操作。

因此,您应该能够在Broadcast(USB_ACCESSORY_ATTACHED)中抓住所需的Service

答案 2 :(得分:0)

有同样的问题:

无法通过插入USB设备来启动服务。

不是那么好的解决方案:

我们向已包含该服务的应用程序添加了一个活动。所有活动都是启动服务,并在插入USB设备时将意图传递给服务。然后活动退出。 (只有活动结束。)这使服务继续运行。我们称之为“System.exit(0);”在活动中“默默地”(即没有弹出)这样做。

为什么它不那么棒?:

  1. 这会在启动器中为应用程序添加一个无用的图标。
  2. 暂时启动活动确实会接管GUI(暂时)。如果其他具有活动的应用程序正在运行,则不确定会发生什么。
  3. 所以,如果有人有更好的解决方案......请发帖!

    OTOH,如果这是Android中的一个错误...嗯,我有点太绿了,不能确定这一点,但如果它是一个错误 - 如何帮助WRT如何跟进谷歌。

    -Thanks

答案 3 :(得分:0)

我还可以确认ACTION_USB_ACCESSORY_ATTACHED在活动广播接收器内不起作用。但我也注意到,如果用户在请求权限对话框中禁止访问附件,那么通常与广播接收器一起工作的ACTION_USB_ACCESSORY_DETACHED将停止接收广播接收器。

E.g。 0.使用广播接收器注册ACTION_USB_ACCESSORY_DETACHED

  1. 在已打开的活动中获取配件,如:

    final UsbAccessory[] accessories = usbManager.getAccessoryList();
    final UsbAccessory accessory = (accessories == null ? null : accessories[0]);
    
  2. 请求用户许可:

    usbManager.requestPermission(accessory, permissionIntent);
    
  3. 在弹出式对话框中:

    1. 如果按&#34; OK&#34;授予权限,然后断开附件并确保在广播接收器中收到ACTION_USB_ACCESSORY_DETACHED

    2. 如果按&#34;取消&#34;放弃许可,然后断开附件,看看在这种情况下广播接收器中没有收到ACTION_USB_ACCESSORY_DETACHED

  4. 因此,如果Android系统没有向广播接收器发送关于用户未授予对话权限的附件的通知(附加/分离),则可能会出现这种情况。因此,只要用户不允许附加附件,附加事件就永远不会出现在广播接收器上。在任何情况下,这看起来像一个错误或破坏的设计,因为无法在广播接收器中接收ACTION_USB_ACCESSORY_ATTACHED事件,用户将不得不在每次重新连接附件时重新启动应用程序或通过手动操作强制连接。