3

Android USB アクセサリのドキュメントには、アクティビティがインテント フィルターによって USB_ACCESSORY_ATTACHED をキャッチする Android マニフェストの例があります。Service/IntentService のインテントフィルターで同じインテントをキャッチすることは可能ですか?

編集

私はこれを試しましたが、成功しませんでした:

<?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;
    }
}

活動のためのPS、これはうまくいきます

EDIT2

インテント フィルターとメタデータをブロードキャスト レシーバーに移動して実験しています。これ以上添付イベントを受信しません。面白いことに、detach イベントを受け取り続けます。ドキュメントの「ブロードキャスト アクション」の分類にもかかわらず、USB_ACCESSORY_ATTACHED はアクティビティでのみ機能するように見えます。

EDIT3: 最終的な結論

USB_ACCESSORY_ATTACHED は、アクティビティでのみキャッチできるように見えます(ユーザーとの対話が可能であるという理由で ?! )。デタッチ イベントはレシーバーでキャッチできます。

4

4 に答える 4

6

私はまた、私のプロジェクトのためにAndroidでのUSBサポートを調査しており、この問題についてAndroidソースを閲覧することになりました。

はい USB_ACCESSORY_ATTACHED と USB_DEVICE_ATTACHED の両方のインテントはアクティビティでのみキャッチできますが、サービス中ではありません。なぜそうなのか、まだ正確にはわかりませんでした。あなたと同じように、USB の状態 (デバイスが接続されている、アクセサリが接続されている) を Service に直接通知できるはずだと思いました。しかし、これは Android での実装方法ではありません。これについてもっと何かを見つけたら投稿します。

Detach インテントは、BroadCastReceivers でキャッチできます。

Android ソースで冒険したい場合は、このディレクトリ ( ICS_SOURCE/frameworks/base/services/java/com/android/server/usb ) から開始して、そこから読み取ることができます。

于 2012-06-21T03:47:02.663 に答える
1

はい、可能なはずです。<service>ドキュメントを見ると、 の要素Serviceに のようなManifestがあることがわかります。<intent-filter>Activity

USB_ACCESSORY_ATTACHEDアクションを見ると、これがService.

SEARCH_LONG_PRESSアクションを見ると、次のことが言及されています。

アクティビティ アクション: 検索キーの長押しに関連付けられたアクションを開始します。

Broadcast(USB_ACCESSORY_ATTACHED)だから、あなたはあなたの目的をキャッチできるはずですService.

于 2012-06-19T09:43:16.737 に答える
1

Had the same problem:

Could not get a service to start based on plugging in a USB device.

Not so great solution:

We added an activity to the application which already contained the service. All the activity does is start the service and passes to the service the intent upon plugging in the USB device. Then the activity exits. (ONLY the activity ends.) This leave the service to continue to run. We called "System.exit(0);" in the activity to do this "silently" (i.e. w/o a pop up).

Why it's not so great?:

  1. This puts an useless icon for the application in the launcher.
  2. Momentarily starting an activity does take over the GUI (momentarily). Not sure what will happen if other applications with activities are running.

So if anyone has a better solution... PLEASE POST!

OTOH, if this is a bug in Android... Well, I'm a bit too green to know this for sure, but if it is a bug - how's about some help WRT how to follow up w/Google.

-thanks

于 2013-07-08T22:53:49.717 に答える