ログの隙間から
E/IrisAppListManager: NAME = jp.rallewll.siriuth.ssidwidget && category = 7
と、デバッグログを放置していたらこんなログが。
気になったので、IrisAppListManagerでググっても検索結果は得られず、IrisAppと検索したらapkのダウンロードサイトとかが引っかかった。
なんだう?
ログの隙間から
E/IrisAppListManager: NAME = jp.rallewll.siriuth.ssidwidget && category = 7
と、デバッグログを放置していたらこんなログが。
気になったので、IrisAppListManagerでググっても検索結果は得られず、IrisAppと検索したらapkのダウンロードサイトとかが引っかかった。
なんだう?
新しいBluetoothキーボードを買ったので正直諦めているBluetooth機器からのスリープ解除を試してみました。が、結局ダメそうですw
デバイスマネージャを見ていてサウンドデバイスにも電源管理があるのを発見。
クソなインテルスマートサウンドが、電源管理をオフにすればまともになるんじゃないかと思ったのですが、こちらも大して差は無し。
10月にインテルスマートサウンドのドライバが更新されたときに若干ましにはなったのですが、根本は変わらず。Windows11になったらまともにならんかなぁと少しだけ期待はしていますが。
で、本題です。Windowsは電源管理はACPIと呼ばれる管理システムの上に成り立っていますが、この辺の設定は結構複雑で、各デバイスレベルでこれに対応している必要があるのですが、パッケージ化されたもののはずなのにうまく機能しないというのは少し納得がいかなかったり。
もともと使っていたネットブックは廉価版のためにBIOSの設定がものすごく簡略化されているためにほとんど設定できないのですが、今使っているものはその辺の設定は解放されている状態です。まぁ見ても知らない設定ばかりだったり。
HD Audio周りもハードウェアコーデックのスイッチや、ACPI周りも結構設定ができるのですが、それをいい感じに無効化できない状態なので微妙な感じはぬぐい切れませんでした。
おそらく安価な省電力化系のノートであれば、もう少しまともになってそうですが、ネットブックレベルだとどうも設計がタブレットベースと割り切られているようできついですね。
最近はあまり写真やスクリーンショットを張り付けていませんでしたが、貼り付けようとしたらどうもうまくいかない…通行禁止マークが表示されるだけという。なんだかなぁw
ずいぶん前にも同じようなことをやっていたが、ググると微妙にヒットしない。リンクを張れば有用なページが上がるかな?
Windows10で配列の異なる複数のキーボードを使う方法 https://www.opensourcetech.tokyo/entry/20200606/1591370282
昔にやったことは本体が日本語で外付けのキーボードがUSキーだった気がする。その時からBluetoothキーボードは配列が違っても設定さえ行えば大丈夫になっていた。上記のリンクは2020/06/06になっているが、過去に行ったのはもっと古い。基本的な考え方はUSB接続のものにも使えた気がする。
HIDキーボードのハードウェアインスタンスパスを見つけて、、とここで複数のHIDキーボードがあるとどれかわからないので、一旦Bluetoothキーボドの接続を切って、デバイスマネージャで非表示デバイスの表示を行うと結構一目瞭然だったりします。
解らない場合は、親のプロパティー値を見て辺りをつける必要が出てきます。
レジストリキー HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum ぐらいまで手で開いてHIDのデバイスのインスタンス パスのUUIDっぽい部分で文字列検索すればレジストリエディタですぐに見つかるはず。
必要なのはDevice Parametersに以下の値を追加すること。
KeyboardSubtypeOverride 2
KeyboardTypeOverride 7
USキーボードであれば
KeyboardSubtypeOverride 4
KeyboardTypeOverride 0
と設定する。基本的にbluetoothデバイスの初期化は接続時に行われるので、レジストリの設定を行えば再起動は不要。
追記
現時点(2022/01/15)の状態のWindows10でProではうまく動作していますが、Homeでは再起動してもダメな模様。詳細は不明ですが、キーボードレイアウトは切り替わったので、単純にドライバが異なっているのかも?
ドはまりしました。
ContentProviderでデータ共有しているアプリとそれを利用しているResolverで全くうまくいかなかった。
ここ数年正直Androidへの興味が正直失せていたのは事実なんですが、ここまでガードするかというほどガードされてました。まぁいいんですが。言いたいことはあるけどもキリがないですねぇ…。
と、今回ハマった経緯は、SDKレベル29か30で止めておくとそれなりにエミュレータ上のAndroid12でも動いてくれていた。が、targetSDKを31に上げると動作が怪しくなっていくという。よくあるパターン。Androidの方針としては従来のリソースはできる限りリソースが動作できるようにAndroid側でカバーして実行してくれるのですが、その指標としてビルド時のtartgetSDKレベルを使用しています。それでもダメとなるとバッサリ行かれちゃいますが、その辺は色々な人がかかわっているようで、流行やら何やらで色々変わっている印象を受けます。
とりあえず利用する側の調整が落ち着いたので、共有側に手を入れたのですが、Android11とか12だと全くうまくいかないという結果に。
エラーを見ても全くどういう状況下把握すらできず、ひたすらググるのみ。ただ、ほとんどの情報は枯れた過去のAndroidバージョンの話とかが大半でほしい情報がなかなか得られず、右往左往しました。その中でも興味深いと思ったのが、uriのcontent://com.hogehoge.provider/tableという記述の「content://」を取ったらうまくいったという記述。いやいやまさかwと思いつつもやってみると実行時エラーの内容が変わっていって、しかも何となく内部で動いてくれているっぽいような記述に変わっているという。実際のソースを追いかければその辺も見えてきそうなんですが、SDKは定義体ぐらいしか見れないのでなんていうかね…ソースは公開されているという話だけど、未だ見たことがない。
そんなブラックボックステストをしつつ、必要そうな記述を追加したり外したり、入れ替えたりと。ですが、結局変わらず。
あきらめついでにバッテリーが膨らんで放置しているスマホの電源を入れて動作確認したりしながらいろいろと考えてみるが、わからんものはわからんという当たり前の話。
しかしながらググりまくってなんか面白いサイトがあって、そこのページを見ていると今まで見たことないAndroidManifestのキーワードが。
<queries>
なんかパッケージ名とか記述してるみたいだけどなんなんだろうと、さっそくデベロッパーズドキュメントへ。
Android 11 以降をターゲットとするアプリで、自動的に公開されるアプリ以外のアプリとの連携が必要な場合は、アプリのマニフェスト ファイルに <queries> 要素を追加します。
は?自動的に公開されるアプリ?何を言ってるかマジわからんが…。
ん~っと、もしかしてパッケージとかインテントとかそれなりに投げればそれなりに処理されていたのが、アプリ側からは相手がいないように見えるってことか?しかもそれがデフォルト?
いやなにそれw
はぁ…kitkatぐらいの時点でAndroidの変更点とか見るのが嫌になってるんですが、そこのつながりにこんなこと書いてあったっけか??
と、ものすごい現状の動作の状況が納得いくので、期待して記述を追加してみました。
ちなみに、ContentProviderは基本的に何らかのpermissionを設定するように強制されているのか推奨されているのか不明な状態ですが、どっちにしてもandroid:protectionLevel="signature"が最低でも強要されると思われるので設定していたりします。リリース時はあれだけどデバッグ時はどうなんだろうと思って最初はリリースビルドを行ってエミュレータにファイルを入れてインストールしていたのですが、試しにそのまま実行したらうまくいきました。記憶をたどれば確かデバッグ用の認証キーでパッキングしているとかなんとか見かけた気がします。そのおかげでデバッグはそこまで面倒ではなさそう。
ただ、Android11はnormalでも動いた。12はどうだろう?→ダメでした。何らかの権限設定が必要で、ContentResolver単体で行おうとするとsignature以外に選択肢はなさそうです。