UfoSaCtrlTrip Ver4.00 U.F.O. SA TW A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ

前回のリリースでお伝えしましたとおり、今回のリリースにてようやくTargetAPIの最新化(Android14 API34 Upside Down Cake)を果たしました。
また、必ずしも実用に足るとは限らないのですがモーター稼働積算計を新規に実装してみました。

対象となるデバイスは以下になります。

大変更点(権限周りの整理)

今回の目玉はこのアプリ(過去のDualやProなどのアプリも含め)のTargetAPIをずっと22(Android5.1 Lollipop)に留めていたものを遂に最新化して34(Android14 Upside Down Cake)にしたことにあります。

これによる影響は主に権限周りに出ます。
このアプリはBLE(Bluetooth Low Energy)にて対象機器に接続して動作をコントロールするだけのものなのですが、AndroidOS側の仕様によりBLE機器を捜索(Scan)する場合は一律「位置取得」に関する権限を有しなければならないという謎かつ粗暴な切り分けをされていまして、中途半端に知識のある人にはまるで情報収集でもしているかのように誤解されかねないという嫌な点がありました。
また、実際に「位置取得」をONにしていないとBLE機器のScanをAndroidOSがしてくれないという形になっていたため、このアプリでも仕方なく「位置取得」に関する権限を要求し、「位置取得」をONにしないと接続できない、と説明してきました。
(BLE機器Scan操作だけが阻害されるので、一旦接続が出来たあとは「位置取得」がOFFであってもコントロールできます。)

TargetAPIを22に留めていたのは、このバージョンに留めていると、「位置取得」に関する権限はインストール時に確認されて権限付与され、また、機種によっては「位置取得」をONにしていなくてもBLE機器のScanが出来て接続できる、というメリットがあったためでした。

しかしながらAndroid12でまた大きな仕様変更があり、Android12以降ではBLE接続と「位置取得」を切り離すことができるようになりました。
つまり、Android12以降ではBLE機器をScanする権限と接続する権限を付与するだけでこのアプリの対象機器をコントロールできるようになります。

すると今度は、逆にTargetAPIが22のままですとAndroid12以降の「位置取得」切り離しが出来ずに、Android12以降の機種でも「位置取得」に関する権限を要求して、機種によっては「位置取得」をONにする必要もあ(ったかもしれません)りました。

徐々に古い機種は故障したりして使用されている台数が減っていくのに対してAndroid12以降の新しい機種が増えていく傾向にあります。
そこで権限周りを再度整理し直して最適化を試みてみた、というのが今回の大きな改修内容となっております。

TargetAPIを最新化することのデメリットは主にAndroid6(Marshmallow)〜Android11(Red Velvet Cake)、いわゆる「位置取得」関連を必須とされていた時代の機種たちで、これらがインストール時には権限の要求がされず、また機種に関わらず「位置情報」をONにしないとBLE機器のScanをOSが行ってくれない、という状況になります。
そうなると、自前でOSのアプリの設定に行って「位置取得」権限を付与して「位置情報」をONにして、という操作が必要になるのですが、流石にそれは不便に過ぎるということでアプリ側から必要に応じて権限取得のダイアログを出したり、「位置情報」をONに出来る設定画面を出したり、といったヘルパー機能を実装することにしました。

今まで運良く「位置情報」をONにしなくてもBLE機器の接続が出来ていたAndroid6(Marshmallow)〜Android11(Red Velvet Cake)の機種でも今回のバージョンからは「位置情報」をONにすることが必須になってしまいます。
接続が出来たあとはOFFにしてしまって問題ありませんので、接続時だけはご面倒でもONにしてください。
なお、繰り返しますがこれはAndroid6〜11の機種に限った話です。
Android12〜は「位置取得」関連は無関係になりました。
Android4.4〜5.1はインストール時に権限付与され、また、「位置情報」をONにしなくてもBLE機器の接続が出来ます。(筆者は4.4しか所持していないので5.0や5.1で違っていたらごめんなさい。)

まとめますと、権限周りは大きくAndroid4.4〜5.1、6〜11、12〜で分けられ、さらにAndroid6〜11ではGPSを持っているかどうかでも分かれます。(例えば安価なタブレット端末などではGPSが装備されていないことが結構あります。)

ここからスクリーンショットを交えて説明いたします。

■Android4.4〜5.1

インストール時に必要な権限が全て表示され、インストールをもってその権限が付与されるため特別な操作は要りません。
「位置情報」(GPS)をONにする必要も無く、BluetoothさえONにすれば対象機器を接続しコントロールできます。

BluetoothがONになっていなくても「Connect」ボタンをタップするとBluetoothをONに出来るダイアログが出るのは従来どおりです。

■Android6〜11

機種によってはAPKファイルを実行するインストールに対して警告が出ることがあります。これは野良アプリの宿命でしてAndroid12以降でも同じです。

そして、インストール時点では権限の要求がされないと思います。

ですが、実際にインストールしてからアプリの設定を見てみると、

『許可』のとこらに「権限が付与されていません」とあり、さらにそこをタップしてみると、

『位置情報』の権限がオフにされている状態です。
このままですとBLE機器のScanが出来ずに接続できません。
そこでここをオンにする必要があるのですが、流石にこれを各自手動でとするのは酷ですので、アプリ側でダイアログを出すようにしました。

アプリの「Connect」ボタンをタップしますと、

『位置情報』にアクセスする許可を付与できるダイアログが表示されます。
ここで許可していただくと、このアプリに『位置情報』の権限が付与されて、先ほどの画面も、

このように権限が付いたことが表示されます。

また、Android6〜11ではこの権限が無いとBLE機器のScanが出来ずに接続できないため、上記ダイアログで許可されなさった場合などでは以下の表示がされます。

続いて、GPSいわゆる『位置情報』がONになっていない場合はこれもONにしてもらう必要があるため、『位置情報』のON/OFFを切り替えられる設定画面が呼び出されます。

GPSさえONになっていれば接続はできますので、高精細の必要はありませんWiFiとかも要りません。この辺はお好きにどうぞ。
また、GPSが搭載されていない機種ではここの設定は不要ですのでこの画面は出さないようにしています。
うちにある機種ではこれで問題無く動作したのですが、もし問題がありましたら環境や条件等と合わせて教えていただけると幸いです。
逆にGPSの無い機種でも『位置情報』権限だけは必要ですのでそちらはダイアログを出しています。
(GPSの無い機種の場合、簡単には済まないケースがあるかもしれないことを『UfoSaCtrlTrip Ver4.01 U.F.O. SA TW A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ』の記事内で説明していますのでそちらもご覧ください。)

さて、こちらの設定画面で『位置情報』をONにせずに戻ってしまった場合はやはりこのままでは接続できないのでその旨のメッセージを表示します。

ONにした場合は、

続いてBluetoothがオンになっているかどうかのチェックを行い、オンになっていない場合はオンに出来るダイアログが表示されます。(ここからは従来の流れと同じです。)

■Android12〜

野良アプリインストールの警告画面が出る点なども含めてインストール作業そのものはAndroid6〜11とほぼ同じだと思います。
アプリを起動してから必要とされる権限が少なく済みますので、「Connect」ボタンをタップしたときに出てくる表示が少なく簡潔になります。

「付近のデバイスの検出、接続、相対位置の特定を UfoSaCtrlTrip に許可しますか?」
と出ますので許可してあげてください。
実際には検出と接続はしてますけど相対位置の特定はしていません。というか、出来るのかどうかも知りません。
対象となる機器の方の機能が非常に簡素なので、動作コントロール以外できないと思うのですが。
なお、気になる方向けに具体的にAndroidManifest.xmlに記述している宣言をここに抜粋記載しておきます。

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:minSdkVersion="31" android:usesPermissionFlags="neverForLocation" tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" android:minSdkVersion="31" android:usesPermissionFlags="neverForLocation" tools:targetApi="s" />

当然のことながら、この権限を許可してもらえないと接続もコントロールも出来ませんので、許可しなかった場合は、

ささやかな恨み節が表示されます。

素直に権限を許可していただくと、続いて従来どおりBluetoothがオンになっているかどうかチェックしてオンになっていない場合はオンにするようダイアログが表示されます。

ここで許可してあげるとそのまま対象機器をScanして、存在すれば接続します。

一応、位置情報が全く関係無くなったことを見ておきましょうか。

ご覧のとおり、「位置情報」はオフのままです。
また、「位置情報」の権限はそもそも要求すらしていないです。

■お願い■

今回このアプリではこのような整理をしましたが、もしかしたら今回のプログラムでは権限周りの制御が上手く行かずにBLE機器の接続が出来ないというケースがあるかもしれません。
もしそのような事象があって、かつお困りでしたら、環境や条件、生じる現象等なるべく詳しく教えていただけると幸いです。

筆者が所持している機種では上記で問題なく稼働しているため、もし不具合等あっても筆者の手元では再現できない不具合になってしまい手探りになることが予想されます。
ですので情報だけが頼りになってしまいます。
また、理想的な解決が出来ずに場当たり的な対処でお茶を濁させていただく可能性もありますことをご了承ください。

機能追加(モーター稼働積算計)

筆者の超個人的ニーズにより生まれたアプリでもありまして、筆者の技術お勉強の題材(おもちゃ)にもなっているこのアプリにちょっと試験的な実装をしてしまいました。

筆者、最近、何度かU.F.O. SAのバッテリーを枯渇させてしまいまして、チクニー中にバッテリーが切れてしまい多大なストレスを感じたんですね。当然その日のアナニーにも悪影響が大きく出るわけです。
元々、アナニーオナニーチクニーが順調だったころはU.F.O. SAの使用に関しても割とコンスタントで「あ、そろそろ充電が必要だな」って気付いて充電できていたのですが、近頃はすっかりペースが乱れていて充電間隔とかもマチマチでまだ大丈夫だろうと思っていたらなんかモーターが動いてなさそう→バッテリー切れてた、みたいなことが立て続けに何回か起こってしまったんです。

さらに脱線してしまうと、U.F.O. SA側のバッテリーがイカれかけている可能性もあるのですが、これが一度バッテリーを自力で交換したときからなんか若干怪しいところがありまして、充電プラグ挿しても充電中ランプ表示がされないことが頻繁にあるんです。
それで、不良バッテリー掴んだかと思って早々に次の換装とか考えていたのですが、実際にはランプが点かなくても充電が密かに進んでいることもあるらしく、その辺りはU.F.O. TWと似たような現象なのかな、などと思ったりして現状そのままにしてここまで使用して来てるんです。
(換装した中華バッテリーの線が異様に細いので充電抵抗が大きくてランプが点くほどの充電電流が流れていないのではないかと筆者は想像していますが真相は分かりません。でも筆者の使用パターンだと使用時よりも充電時の方が電流多いんだよね。だから使用時には問題を感じずに済んでいるのかもしれない。あ、過去記事どっか探せば換装したバッテリーの写真もあるとは思いますが撚線ですらない細い単線なんです。ちなみに純正のバッテリーの電線はちゃんと撚線でしたよ)

ちなみにU.F.O. TWの充電で筆者は付属の12Vアダプターを使用せずに5Vの一般的なUSB電源アダプターを使用して電流計を間に挟んで充電状態を監視しているのですが、そのような形を取ると充電はしているけど充電中ランプは点かないという状況になることがほとんどなんです。
なお、さらに脱線すると筆者のU.F.O. TWは今現在使用頻度が低く、基本的にはU.F.O. SAを優先的に使用しているのが現状なのですが、久し振りにU.F.O. TWを充電しようとするとポゴピンの接触が悪化していてなかなか接続せずに、端子を掃除したり何度も接続やり直したりをするハメになったりするので、そういう意味でも充電電流を監視しないとちゃんと通電しているのか分からない、という状況になっています。
あ、そもそも充電電流を監視している大元の理由はU.F.O. TWのバッテリーを劣化させたくないので満充電になる前に充電止めたいという思惑から監視しているものでして、満充電に近づくと充電電流が落ちてくるので、落ちて来たら充電を止める、という作業をしています。
満充電までしたところでU.F.O. TWのバッテリー持ちは大したことないので無理して何回か使うよりも、1回使用するごとに中途半端な充電をした方がバッテリー容量の保持には有効だろうと判断してこのような運用をしています。まあ、この辺りの詳しいことは筆者のU.F.O. TWレビューの過去記事とかもあさってみてください。

んでですね、ちょっとだけ話を戻しますと、筆者はU.F.O. SAを片乳毎に計2台を同時使用していまして左右別々動作をU.F.O. SA2台で実現しているわけですが、そうなると、バッテリー容量的には普通の人よりもかなり長時間持つようになるんですね。
具体的には筆者のチクニーのペースでバッテリー新品なら5,6回分くらいは余裕で持つ。
そうすると充電タイミングを忘れてしまうこともあるんですね。
また、上記で充電プラグ挿しても充電ランプが点かないことがあって、それで長時間放置していても充電が十分に進んでいないこともあるのかよく分かりませんが思ったよりも早くバッテリー枯渇してしまうこともあってその辺が非常に日和見になってしまっているんですね。

そこでようやく話が元に戻りまして、U.F.O. SAやU.F.O. TWのバッテリー状況とかBLEで取得出来んかなとか思って調べてみたのですが、まあ、あるわけないわなそんな豪華な機能。

筆者の場合に限って言いますとU.F.O. SAやU.F.O. TWを動作させるときは必ず筆者自作のコントロールアプリで動かしていますので、それならある程度はアプリ側で目処付けられないかな、というのが今回のモーター稼働積算計を実装した経緯になります。

とはいえ、これが本当に役に立つというケースは少ないと思われます。
というのも、U.F.O. SAを単独で起動していたり動作させていたりする分をアプリ側は検知できない、ダイレクトに消費電力を計算することはできない、からです。

例えば、モーターへの出力指示は0〜100で出来て逆回転は0〜-100で指示できるのですが、これの例えば1と100とで電力差は100倍とかにはなりません、多分。U.F.O. SA
の連続稼働時間は仕様上2時間となっていますが、例えばこれをこのアプリから1で動かしたてほったらかしたら200時間稼働できるのか、といったらそんなことは絶対無いわけですよね。
つまり、アプリから指示できる出力と電力とは単純な比例関係では表せないということになります。なんならリニアでもないかもしれない。
さらに、停止状態での消費電力も分かりませんし、BLEの待受の電力、通信の電力も不明です。
あらゆる電力が不明であるため、どこをどう計上しても参考値の域を超えられません。

なので、ここではやはり一番電力への影響が大きいであろうモーターへの出力指示の状況を単純に時間単位で積算してみることにしました。
時間単位はこのアプリでは100msが単位ですのでこれを1としまして、例えばモーターへの出力指示20を1秒行ったら20×10(100msec単位で10が1秒)=200カウントするようにしました。

こうやって積算していって、ある程度同じような制御でチクニーをしている人であればある程度バッテリー消費との相関も見えてくるかもしれません。
ってくらいの機能にしかならなかったのですが、筆者これ試してみて意外に相関出たので筆者個人的には面白かったです。
といっても、現在まだ3回しか試していないのですが、各チクニーでの積算値が片乳ごとに
423,498/422,830(約2時間くらい使用)
398,957/402,432(約2時間くらい使用)
305,057/306,904(約1時間半くらい使用)
時間も非常にアバウトなのでアバウトに捉えていただきたいのですが、筆者の場合はだいたい30分で10万くらいカウントが進むという相関が見えてきました。
ちなみに筆者はこのアプリではランダムパターンVolume1を常用していて、ちょいちょい停止して小休止しています。

こんな感じにどれくらいモーターを動かす指示を出したかというのはアプリの方で計上できるので、人によってこの値をチクニーごとに記録して分析してみても、それだけでも面白いかもしれません。

それではモーター稼働積算計の画面の説明です。

上部のアプリタイトルとメニューが表示されている帯に一つアイコンが追加されています。
右から2番目のアタッシュケースと時計のアイコンです。(出来合いのそれっぽいものを使用しています)
このアプリにとってのお仕事メーター的な意味合いでこのアイコンを選択してみました。(自作まではしないところが筆者のズボラを示しています)

あ、ところで、上の画像ではアイコンが全てグレーになっていますが、今回の改修でその機能を使わないように設定している場合はアイコンをグレーアウトするようにしました。
なので上の画面の状態ではモーター稼働積算計も機能しませんし、その左のLCDバックライトOFFボタン(実際には消灯して画面ロックまで行う)も機能していません。

これらの機能を使用したい場合は一番右の︙アイコンをタップして、

「Switches」をタップしてスイッチ設定画面を開いてください。

最初は上の3つの機能全てチェックが付いていないと思います。
アイコンの表示位置に合わせて上から2行目の「モーター稼働積算計を使う」のチェックを付けるとモーター稼働積算計の機能が有効になります。(その他は以前のバージョンから変更ありません)

試しに、

全機能にチェックを付けて有効にしますと、

アイコンがカラーになり、LCDバックライトオフのアイコンは紫色に、モーター稼働積算計は緑色になって機能が有効になったことが示されます。(LCDバックライトオフの方を機能させるには端末管理権限も必要になりますが以前のバージョンの説明をご覧ください)

で、緑になったアイコンをタップしますとモーター稼働積算計の画面が開きます。

UfoSaCtrlTripでは最大3つの機器が接続できますが、その接続番号ごと(機器ごとではありません。このアプリの1)〜3)と対応しています。にモーター稼働積算計が動きます。

上記の画面例は筆者が1時間半ほどチクニーした後の値が表示されていて、1)にも2)にも値があるのは筆者が片乳ごとに2台のU.F.O. SAを稼働させているからです。
「↻」マークをタップするとリセットされて0になります。

「↻」マークの右側は注意値と書いてありますが、ここの値は自由に変更できまして、ここの値を実際の稼働積算値が超えたときに、(1)〜3)のうち一つでも超えれば)

モーター稼働積算計のアイコンの色が赤に変わってくれます。
ただし、注意値のところを0(ゼロ)にしている場合は値を超えているかどうかの判定を行わないので注意値が全てゼロになっているときはアイコンが赤くなることはありません。

これは充電の必要の目安にできるかもしれないと思って実装した機能です。
例えば筆者のチクニーパターンですとだいたい30分で100,000くらい積算値が増えるので1,500,000くらいに指定してあげるとそこそこ良い感じになるかなと思っています。(がまだそこの有用性までは検証できていません(^^ゞだって充電ったって月2,3回しかしないもん)

筆者は片乳分の負荷しかないので1台のU.F.O. SAで2つのモーターカップを動かしている人はもっと少ない値になるでしょうし、筆者基本ランダムパターンのVolume1ばっかり使用している人なので、それより強めで動かしている人はまた違った値になるかと思います。
コツとしては、もう一回チクニーしたら途中でバッテリー切れてしまうかも、という値もしくはそれ以下にしておくことです。
チクニー中にバッテリー切れるとげんなりして気分が削がれてしまうのでそれを防止したいという思惑のお助け(できるかもしれない)機能ですので、そろそろバッテリー充電したらどうでしょう? という注意喚起に使用していただければと思います。

あるいは、バッテリーとは無関係に乳首への負担をこれで計ってみるとか、単純にどれだけチクニーしたかメーターとして使用していただいても良いかもしれません。
「オレ昨日100万カウントもチクニーしちゃったぜ」
なんて会話がそこかしこで行われ……るわけがあるめえ。なったらなったで面白い世の中だって思えるんですけどね。

従来からの機能の説明はこちら

毎度ゴメンナサイ。m(__)m
いい加減たまには使用方法とかまとめないとなあ、とはちょくちょく思うのですが、こうして変更点書くだけで毎回結構な量になってしまってとてもまとめなんかした日にゃあ薄い本が分厚くなるのでその他既存の機能についてはこちら
UfoSaCtrlTrip Ver3.10 U.F.O. SA A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ
UfoSaCtrlTrip Ver3.00 U.F.O. SA A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ
UfoSaCtrlTrip Ver2.20 U.F.O. SA A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ
UfoSaCtrlTrip Ver2.10 U.F.O. SA A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ
UfoSaCtrlTrip Ver2.00
UfoSaCtrlTrip Ver1.0
の過去記事をご覧ください。

筆者はなるべくアプリのサイズを小さくしたいと思って極力余計なモジュールを読み込まないようにしてきたのですが、今回の機能追加でついに200KiBを超えてしまいました。仕方ないね。
筆者のへんてこなコダワリにより、200KiB強の小さいアプリながらも機能がアホみたいにてんこ盛りなので、もっと使い込んでみたいと思われた奇特なお方(ほめことばよん♥)は過去記事の説明もご参照ください。
きっと文量に圧倒されて見る気を失うことでしょう。わはは。

ダウンロードファイル

勝手な再配布はしないでください。
また、このファイルのみへの直接リンクを貼ることもご遠慮ください。
特に、うちのサイトは弱小なので、検索で上位に表示されるサイトに勝手にコピーされると、盗まれたのとほぼ同じ状況に陥ります。
何かしらの問題が発覚して、こちらのサイトでファイルを差し替えても、それが皆さんの元には反映されなくなることにも繋がります。

諸事情によりアプリの無料配布を終了致しました。
今後は活動を支援してくださる方とのみ細細と共有していければと思います。

今後のUfoCtrlアプリ配布ページはこちらです。
UfoCtrl Ver1.00 (UfoCtrl開発活動支援プラン)

(2023-11-17 不具合が発覚し修正しましたのでVer4.00を廃版とし、Ver4.01としています。修正内容等については『UfoSaCtrlTrip Ver4.01 U.F.O. SA TW A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ』の記事をご確認ください。お手数お掛けしてすみません。)
(2024-01-18 Android14の実機確認ができるようになり不具合を改修したためVer4.01は廃版としました。修正内容等については『UfoSaCtrlTrip Ver4.02 U.F.O. SA TW A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ』の記事をご確認ください。)

※申し訳ありません。
いつそうしたのか全く記憶にないのですが、当アプリのPackage名を部分的に大文字混じりにしてしまっていて今回プログラム中で大文字混じりの部分と小文字のみししている部分とが入り混じって統一できていないことを発見しましてVer4.00にて統一修正しました。
そのためVer3.10までのバージョンとはPackage名が変わっているためアップデートインストールにならず必ず新規インストールになってしまうと思います。
お手数お掛けして済みませんが設定等前バージョンからの引き継ぎが出来なくなっていますので改めて設定作業をしていただくようお願いいたいます。

なお、Ver3.00以降で画面オフボタンの機能を使用していた方は管理権限を外さないとアンインストールできなくなっていますのでご注意ください。

2023-11-10

この記事のタグ

U.F.O.

TW

SA

アプリ

制御

電動

自作

チクニー