4

私が取り組んでいるアプリケーションは、USB 接続を介してデバイスに正常に接続します。

さらに、 USB デフォルト接続を保存する次のスレッドでも指摘されているように、さまざまな起動からのデバイスを記憶するようになりました。

ただし、これにより、USB デバイスが接続されているときに常にアクティビティを起動するという望ましくない影響が残ります。アプリケーションを起動しない限り、デフォルトを思い出すことができませんでした。接続時にアプリケーションを起動することは、望ましい効果ではありません。以下の小さなコード サンプルは、将来の接続用にメモリに保存されている既定の USB 接続を一目で確認できるようにするための現在のマニフェストです。アプリケーションを起動せずに、このデフォルトの保存を行うことはできますか?

<activity
     android:name="com.MainScreen"
     android:theme="@style/Theme.Default"
     android:configChanges="orientation|keyboardHidden|screenSize"
     android:label="@string/app_name">  
     <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>

起動不可能なインテントとして指定するインテント フィルターに追加できるカテゴリのタイプがあるのではないかと考えていました。活動中に聞いていたが、活動によって処理されたもの。しかし、これまでのところ、私はこれを見つけていません。

アップデート:

マニフェスト内のサービスまたはレシーバー内で USB デバイス接続の意図を宣言することも、接続情報を保存しようとする試みです。ただし、アクティビティ内のインテントのみが接続状態を記憶するため、後で特定の時点で再接続されたときにユーザーに尋ねる必要はありません。接続時にアプリケーションを起動することと組み合わせて、状態を保存するためだけに設計されているように見えます。少し奇妙ですが、USB 接続デバイスのデフォルト接続を記憶することと組み合わせて起動しない場合の回避策はありません。

4

3 に答える 3

3

常にアクティビティを起動する必要はありません。バックグラウンド サービスにインテントを静かに処理させることができます。

<service android:name=".MyService">
     <intent-filter>
          <action  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     </intent-filter>
</service>

アップデート:

一部のアクセス許可を明示的に要求する必要がある場合があります。すべきことは次のとおりです。

  1. ユーザーがアプリをインストールして初めて開くときに、USB 関連の権限を要求します。
  2. 上記のように、USB 接続イベントを処理するサービスを設定します。接続すると、認識されたデバイスが接続されている限り、ステータス バーに永続的な通知が表示されます。
  3. ステータス バーの通知は、追加のアクセス許可が必要であり、メインの UI アクティビティにアクセスできることをユーザーに通知するのにも役立ちます。
于 2013-08-05T13:28:11.583 に答える
1

私自身の実験で、USB デバイスがサービス内から記憶されないことを確認できます。requestPermission() は Activity から出てくる必要があるようです。

アクティビティの起動を避けるために、次のようにonPostCreate()を実装しました。

@Override // from Activity
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    Intent triggerIntent = getIntent();
    if (triggerIntent != null) {
        if ( ! triggerIntent.hasCategory(Intent.CATEGORY_LAUNCHER) ) {
            Log.e(LOGTAG, "not started by launcher! exit now.");
            finish();
        }
    }
}

コードを onCreate() に貼り付ける代わりに onPostCreate() を使用しました。これは、onCreate() から finish() を呼び出すとすぐに onDestroy() が呼び出され、通常、Activity クラスのすべてのメンバーがまだ適切にセットアップされていないためです。onPostCreate() アプローチを使用する方が安全なようです。

于 2017-01-02T22:45:27.270 に答える