この䞍思議なHTC Dot Viewはどのように機胜したすか

HTCの䞖界では、ドットビュヌのようなものがありたす。 HTC Dot Viewは非垞に独創的なケヌスで、HTCOne lineの高床なモデルのナヌザヌが非垞に非暙準的な方法でデバむスを䜿甚できるようにしたす。 このアクセサリは、䌚瀟にさらに倧きな栄光をもたらすように蚭蚈されおおり、そのタスクにうたく察凊しおいるようです。倚くの人がHTC One *を支持しお遞択し、Dot Viewケヌスのおかげです。



このようなアクセサリは、ナヌザヌが倚数のレビュヌを行うだけでなく、モバむル開発者もこれらのクヌルな機胜を䜿甚する非暙準のアプリケヌションを䜜成するこずを促したす。 メヌカヌHTCの暙準的なDot View機胜セットは非垞に豊富です。トラックスクロヌル機胜を備えた䟿利なプレヌダヌ、ケヌスの「ポむントに」さたざたな通知の出力、および「ビッグピクセル」を備えた過去の「8ビット時代」を連想させるシンプルなゲヌムですらありたす。 しかし、唯䞀の問題は、公匏開発者が䜿甚するAPIだけでなく、Dot Viewの発案の仕組みに関するわずかな指瀺さえも提䟛しなかったこずです。 これは、愛奜家がケヌスをデバむスずペアリングするためのメカニズム、および調査する研究者を独立しお理解しなければならないずいう事実に぀ながりたした。



このトピックでは、HTCのこの魔法のカバヌがどのように機胜するかを理解しようずしたす。











これは䞀぀の倧きな陰謀です





すでに䞊で述べたように、このケヌスはそのデバむス専甚の公匏メヌカヌによっおリリヌスされたした。

ケヌスは、取り付けられた磁石が内郚機噚ず盞互䜜甚するように蚭蚈されおおり、電話機がケヌスを装着しおいるこずを理解できたす。このケヌスはドットビュヌです。 そしお、磁石自䜓は、HTCマヌキングのすぐ䞋にありたす。







デバむスのカバヌを装着するず、システムで起動されたサヌビスがカバヌずやり取りを開始し、デバむスの電力消費状態制埡モヌドをむンタヌセプトし、公匏メヌカヌから「特定の」アクティビティを起動したす。 ぀たり、モバむルデバむスは、゜フトりェアレベルずハヌドりェアレベルの䞡方でこのケヌスずペアになりたす。 ここでもう少し詳现なレビュヌを芋぀けるこずができたす 。



APIが存圚しない堎合はどうなりたすか





最初に質問しなければならないのは、このような質問でした...実際、このようなナニヌクなアクセサリに぀いおは、サヌドパヌティの開発者向けにAPIがリリヌスされおいないずは信じられたせんでした。 ネットワヌクを怜玢するプロセスでは、カスタムXposedフレヌムワヌク甚のDot View モゞュヌルの実装など、䜕らかの圢で関連する問題がいく぀かありたしたが、実際にプッシュしお、最終的に独自のアプリケヌションでDot Viewの機胜を䜿甚できるものはありたせんでした。 したがっお、私は自分の調査を始めなければなりたせんでした。



真実を理解するための最初のステップは、システム内の特定のDot Viewコンポヌネントの存圚を正確に瀺す゜ヌスがあるlogcatを調べるこずでした。



W/SensorService( 870): Listener[0] = com.htc.dotmatrix.CoverService$7@24541961 W/SensorService( 870): Listener[1] = com.htc.dotmatrix.CoverService$7@6b8ab5b W/SensorService( 870): Listener[2] = com.htc.dotmatrix.CoverService$7@f1d0b5a ... D/DotMatrix( 1287): [CoverService] resetCoverViewState, poleN: false, state: true D/DotMatrix( 1287): [CoverService] updateCoverState, (sticky)poleN: false, state: true D/DotMatrix( 1287): [CoverService] updateCoverState, (intent)poleN: false, state: false D/DotMatrix( 1287): [CoverService] updateCoverState, removeMessages EVENT_COVER_CLOSED D/DotMatrix( 1287): [CoverService] show cover D/DotMatrix( 1287): [DotImage] init com.htc.dotmatrix.ui.BackgroundImage D/DotMatrix( 1287): [DotImage] init com.htc.dotmatrix.ui.TemperatureImage D/DotMatrix( 1287): [DotImage] init com.htc.dotmatrix.ui.LastCallImage
      
      







最初に思い぀いたのは、logcatの最も興味深いログがこのアプリケヌションのパッケヌゞ名を参照しおいたため、公匏のHTC Dot ViewアプリケヌションのAPKを逆コンパむルするずいうアむデアでした。 しかし、最終的には、カバヌのコヌドを蚘述するための有甚な情報を抜出するこずはできたせんでした。ただし、ブロヌドキャストレシヌバヌで䜿甚され、カバヌカバヌの状態を远跡するように蚭蚈された特定の意図アクションオヌプンたたはクロヌズは䟋倖です。



䞀番䞋に到達しようずしお倱敗した埌、私は偶然、ドットビュヌの公匏HTCアプリケヌションの「アプリケヌション」セクションを偶然芋぀けたした。




















その埌、通垞のAndroidアプリケヌションが䞀般的なDot Viewアプリケヌションずどのように異なるかが興味深いものになりたした。 ぀たり、分離はどのレベルですか Google Playで他のアプリケヌションを怜玢した埌、「ブリックをノックアりト」するゲヌムであるDot Breakerの実装に到達したした。 もちろん、他の皆ず同じように、それは公匏メヌカヌのものでした。



Dot Breakerアプリケヌションのおかげで、Dot Viewのすべおの詳现を調べお、ケヌス甚の独自のアプリケヌションを䜜成するこずができたした。



゚ッセンスを怜玢...





アプリケヌションの最初の逆コンパむル埌、 アプリケヌションマニフェスト AndroidManifest.xmlを調べるこずが可胜になりたした。

このマニフェストは、公匏のHTC Dot Viewアプリのマニフェストずはあたり䌌おいたせんでした。 私が最初に目を匕いたのは、暩限の「シヌト」が䞍足しおいるこずです。



 <uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="com.htc.permission.dotviewgame"/>
      
      







結局、少なくずもアプリケヌションはデバむスの状態を制埡したした。 たた、GET_TASKS暩限は䞀般的に廃止されたす。 したがっお、次の解決策が最倧の関心事でした。 圌の名前から、それが非暙準であるこずは明らかです。



アプリケヌションが「アプリケヌション」の同じリストに衚瀺されるようにする責任がある別の蚭蚈ポむントは次のずおりです。



 ... <activity android:name=".WelcomePageActivity" android:screenOrientation="portrait" > <intent-filter> <action android:name="com.htc.intent.action.dotviewgame_launch"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> ...
      
      







倧たかに蚀っお、このカスタムアクションは「android.intent.category.LAUNCHER」のようなもので、 「com.htc.intent.action.dotviewgame_launch」のみです。

たた、アセットアセットには、ゲヌムに存圚するすべおのアニメヌションが収集されたした。







...そしお将来的には、カバヌの「ポむントに」描画するこずは非垞に暙準的な䜜業ではないため、その理由が明らかになりたす。

これに続いお、アプリケヌションの逆コンパむルされたJavaコヌドを盎接分析するこずを目的ずした2次逆コンパむルが行われたした。 逆コンパむルされたコヌドは、BitBucketリポゞトリで提䟛されたす 。



䞊蚘のマニフェストに基づいお、 WelcomePageActivityが Dot Breaker アプリケヌションの䞻芁なアクティビティであるず結論付けるこずができたす 。 圌女が行う唯䞀のこずは、2秒間続く初期アニメヌションドットビュヌずは関係ありたせんを衚瀺し、レベルを遞択するGameLevelアクティビティを開始するこずです。



 ... this.mCountDownTimer = new CountDownTimer(2000L, 2000L) { public void onFinish() { WelcomePageActivity.this.finish(); WelcomePageActivity.this.startActivity(new Intent(WelcomePageActivity.this, GameLevel.class)); } } .start(); ...
      
      







アクティビティGameLevelでは、レベルを遞択できたす。 埩元されたJavaコヌドでは、20のアプリケヌションレベルすべおの初期化の「シヌト」を芋るこずができたす。 各ビュヌをクリックするず、アプリケヌションの䞻芁なアクティビティであるGameActivityを呌び出す次のコヌドを含むAlertDialogがポップアップ衚瀺されたす。



 ... localBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) { GameLevel.this.startActivity(new Intent(GameLevel.this, GameActivity.class)); } }); ...
      
      







このコヌドは「最埌のフロンティア」であり、最終的にHTC Dot Viewコンセプトを実装するための内郚メカニズムが続きたす。



このドットビュヌはどのように機胜したすか





Dot Viewずの察話サむクルの䞭間であるGameActivityの䞻芁なアクティビティは、特別なものによっお区別されたせん-他のアクティビティのように、 Activityクラスから継承されたす。 ぀たり、察話はonCreateメ゜ッドから始たりたす。 このGameActivityアクティビティメ゜ッドのコヌドには、りィンドりの構成ずスタむリングフルスクリヌン、明るさなどを担圓する倚くの呌び出しがあり、メ゜ッドの最埌にキヌ呌び出しが続きたす。



 ... this.mDotViewCommunity.bindDotViewService();
      
      







ここで、 this.mDotViewCommunityはラッパヌクラスのむンスタンスです。これは単玔な抜象化であり、アクティビティクラスGameActivity内にネストされたクラスずしお実装されたす。 このクラスは重芁な圹割を果たさないため、無芖できたす。

しかし、重芁な圹割は、このクラスに含たれる「bindDotViewService」ずいう名前の叫び声でさえも、メ゜ッドによっお果たされたす。 この段階では、おそらくプロセス間通信IPCの目的のために、特定のサヌビスずの接続があるず想定できたす。



bindDotViewServiceメ゜ッドのキヌコヌドは次のずおりです。



 ... DotViewSericeConnection mServiceConnect = new DotViewSericeConnection(); ... Intent localIntent = new Intent(); localIntent.setClassName("com.htc.dotmatrix", "com.htc.dotmatrix.GameService"); bool3 = GameActivity.this.bindService(localIntent, this.mServiceConnect, 1); ...
      
      







ご芧のずおり、Dot Viewカスタムサヌビスずのリンクは、さらにサヌビスず察話するために実際に行われおいたす。 サヌビスクラスの名前はcom.htc.dotmatrix.GameServiceで 、このサヌビスが属するパッケヌゞアプリケヌション は非垞に公匏なHTC Dot Viewアプリケヌションです。 DotViewSericeConnectionは、サヌビスの状態を監芖するための暙準のAndroid ServiceConnectionむンタヌフェむスの実装であるカスタムドットブレヌカヌクラスです。 DotViewSericeConnectionクラスは 、アクティビティクラスにネストされたクラスずしおも実装されたす。



さお、これはおそらく予想される結果ですが、HTCのサヌビスに接続した埌、Dot Breakerゲヌムの盞互䜜甚はどのように展開したすか



ServiceConnectionむンタヌフェむスには、オヌバヌラむドされたonServiceConnectedメ゜ッドが必芁です。このメ゜ッドは、サヌビスが正垞にペアリングされた堎合に呌び出されたす。

サヌビスぞの接続が成功した堎合、コヌドが呌び出されたす。コヌドの実行は、Dot Viewを䜿甚するための2぀のステップのうちの最初のステップです。



 public void onServiceConnected(ComponentName paramComponentName, IBinder paramIBinder) { GameActivity.DotViewCommunity.this.mService = new Messenger(paramIBinder); try { Message localMessage = Message.obtain(null, 1); localMessage.replyTo = GameActivity.this.mMessenger; Bundle localBundle = new Bundle(); //    ,  ""  Dot View localBundle.putString("activityName", GameActivity.class.getName()); localMessage.setData(localBundle); //    GameActivity.this.mService.send(localMessage); return; } catch (RemoteException localRemoteException){ ... } }
      
      







ここでは、Androidのコンテキストでリモヌトサヌビスずのかなり暙準的なクラむアントサヌバヌ「通信」を芳察できたす。

what-c​​ode = 1のメッセヌゞがグロヌバルプヌルから取埗されたす。

そしお、アクティビティクラスの最初に、次の定数セットがありたす。



 static final int MSG_DOTVIEW_CLIENT_PAUSE = 4; static final int MSG_DOTVIEW_CLIENT_REGISTER = 1; static final int MSG_DOTVIEW_CLIENT_RESUME = 3; static final int MSG_DOTVIEW_CLIENT_UNREGISTER = 2;
      
      







これは、このメ゜ッドのコヌドがアクティビティを新しい朜圚的なナヌザヌずしお登録したこずを意味したす。

次に、同様のコヌドが呌び出されたすが、what-c​​ode "3" -MSG_DOTVIEW_CLIENT_RESUMEが䜿甚されたす。

その盎埌に、Dot Viewは、特定のアクティビティの蓋のスラミングぞの応答を停止し、それを必芁ずするアクティビティ、぀たりGameActivityのDot-View画面レンダリングを提䟛したす。



さお、サヌビスずの接続ず通信はどうですか





com.htc.dotmatrix.GameServiceサヌビスにアクティビティが「独自の方法で」カバヌを䜿甚し、䜿甚する準備ができたこずが通知された埌、カバヌが非難されるず、画面は消えたせん最初はドットビュヌ機胜が機胜しなくなったようですドット衚瀺モヌドを「キャプチャ」したアクティビティのマヌクアップを衚瀺したす。 画面が空癜になった堎合、スプラッシュ画面の代わりにダブルタップドットビュヌを「起動」する暙準的な方法埌、再び「アクティビティむンベヌダヌ」のマヌクが衚瀺されたす。



同時に、アクティビティはほが暙準的に機胜したす。ボタンを眮くこずができ、そのonclicksが機胜し、暙準のAndroid ゞェスチャ怜出噚を䜿甚できたす。すべお正垞に機胜したす。



しかし、その埌、困難は䜕ですか

どういうわけか最初は、ドットブレヌカヌはすべおのアニメヌションを写真に保存するず蚀われおいたした。 䞻な理由の1぀ただし、ほずんど重芁ではないは、ドットビュヌポむントでのレンダリングの特異性です。 公匏のアプリケヌションが暙準のAndroidを䜿甚しない理由は、それらが単に衚瀺されないためです。 暙準フォントのボタンは、ボタンのようには芋えたせん。むしろ、抌すこずができ、䜕かが「カバヌの䞋」で発生する、ビュヌの圢をしたスポットのようなものです。 ボタンずテキストのサむズを倧きくできるように芋えたすが、すべおが芖芚的に読みやすくなりたすが、さらに信頌性の高いアプロヌチが必芁です。



Dot BreakerアプリケヌションのBrickViewクラス内には、画面ピクセルをDotViewピクセルに倉換する方法が䞊べ替えられおいたす䞀郚、正確な逆コンパむルが行われないため、ロゞックが理解できない堎合がありたす。 それは間違いなく䞀芋の䟡倀がありたす。 シンプルですが、あたり正確ではない方法がありたす-ケヌスのポむント数を蚈算するには











その結果、Xに27個、Yに48個の重みのあるポむントを獲埗したした。「重みを付ける」こずにより、デバむスのディスプレむに重ねられたDotViewポむントを理解する必芁がありたす。 このような情報を䜿甚するず、必芁なスケヌリングを生成するメ゜ッドを簡単に䜜成できたす。



完了1。





䞊蚘の資料はすべお、実甚的な実装のコンテキストで非垞に興味深いものになりたす。

そのため、Dot Viewのいく぀かの簡単なゲヌムが適しおいたす。



テストデモアプリケヌション党䜓は、 3぀のアクティビティをカプセル化したす 。



1 MainActivity-アプリケヌションメニュヌにアプリケヌションを衚瀺するだけで暙準起動のサポヌト、2番目のアクティビティを開始するか、アプリケヌションを終了したす。



2 DotRunnerは䞭間アクティビティであり、その䞻な目的は、ブロヌドキャストレシヌバヌを介しおケヌスのカバヌの状態を監芖し、3番目のアクティビティを開始/停止するこずです。



 ... BroadcastReceiver dotReceiver = new DotReceiver(); // () intent-action IntentFilter intentFilter = new IntentFilter("com.htc.cover.closed"); registerReceiver(dotReceiver,intentFilter); ... public class DotReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { boolean isCoverClosed = intent.getBooleanExtra("state",false); if(isCoverClosed) { startActivity(new Intent(DotRunner.this, DotActivity.class)); } else{ ... } } }
      
      







3 DotActivity-前のセクションで説明したルヌルに埓っおDot Viewず察話するアクティビティ。



スケヌリングを考慮しおDot View画面をより䟿利にレンダリングするには、ゲヌムテストプロセスが実行され、「倧きなピクセル」をレンダリングするためのすべおのロゞックを実装するDotMatrixViewのカスタムビュヌを䜜成する必芁がありたした。



次に、ゲヌムは非垞にシンプルです。萜䞋しないようにキュヌブをタップする必芁がありたす。




















たた、新しいゲヌムを開始するには、ドットビュヌカバヌを開閉する必芁がありたす。 さらに、ゞェスチャ認識むンタヌフェむスがDotMatrixViewゲヌムクラス内に実装され GestureDetectorクラスを䜿甚、Dot Viewケヌスでゞェスチャを飛ばすこずでゲヌムを再び開始できたす。



カスタムアプリケヌションのデモビデオはこちらでご芧いただけたす 。

テストアプリケヌションの゜ヌスコヌドは、 BitBucketのリポゞトリに衚瀺されたす 。



完了0。





HTC Dot Viewの原則を怜蚎した結果、このアむデアには秘密の原則が含たれおいないこずが明らかになりたした。すべおが同じ叀いものですが、「新しいカバヌの䞋」です。



間違いなく、珟代のナヌザヌは存圚する時間に非垞に恵たれおいるず蚀うこずができたす。呚囲には非垞に倚くの䟿利で興味深いデバむスがあり、経隓だけでなく党員を远跡するこずさえできたせん。 たた、Dot Viewなどの開発者がこの珟代性を生み出しおいたす。 実際、党䜓が圢成されるのは、このような些现なこずです。 したがっお、このような「ささいなこず」のためのオヌプンでアクセス可胜なAPIは、単なるプログラミングむンタヌフェむスではありたせん。 これは、叀い抂念の䜿甚を再怜蚎する機胜です。

「新しいものはすべお忘れ去られおいる」c。



All Articles