USB APIを使用して壁にぶつかりました。ブロードキャスト レシーバーを使用してインテント ACTION_USB_DEVICE_ATTACHED を受信しようとしていますが、受信できません。
明確にするために、マニフェストを通じてこれがうまく機能していましたが、それによって新しいアクティビティが作成されました (そしてバックスタックに追加されました)。特に私のアプリ(端末)の性質を考えると、これは望ましくないことがわかりました。
私の推測では、device-filter xml メタデータをインテント フィルターに追加する必要がありますが、その方法がわかりません。
どんなフィードバックでも大歓迎です!
編集 - いくつかのコード。これがマニフェストのジューシーな部分です。動的に登録された BroadcastReceiver にインテントを取得させるために、インテント フィルターがコメント アウトされていることに注意してください (そうする必要があると思います)。
//<intent-filter>
// <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
// <category android:name="android.intent.category.DEFAULT" />
//</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
これが私の受信機を接続するコードです
//register for attachment
IntentFilter attachedFilter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(mUsbAttachedReceiver, attachedFilter);
これは BroadcastReceiver 宣言です
private final BroadcastReceiver mUsbAttachedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//BREAKPOINT HERE IS NEVER HIT
String action = intent.getAction();
showDebugToast(action);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
synchronized(this)
{
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null){
getDevicePermission(device);
}
}
}
}
};
マニフェストでレシーバーを宣言することは避けました。そこで使用するプラクティスについて完全には確信が持てないためです (レシーバーはアクティビティとは別に存在します)。アプリケーションが実行されている限りレシーバーが実行されると考えるのは正しいですか、それともマニフェストで宣言されていてもフォアグラウンドのみですか? これに関する文献は大歓迎です。
その後、アクティビティに「singleTop」起動モードを指定し、onNewIntent() を実装することで、この問題を回避しました。これにより、(マニフェストを使用して) アクティビティを実行せずに起動を許可しながら、必要な動作が得られます。これが私の究極の目標でした。しかし、私は本当にこの動作を理解し、解決策に非常に興味を持ち続けたいと思っています!
さらに編集: 私のデバッグ デバイスは Samsung Galaxy S3 です。ROMは変えていません。