ドッキングステーションSamsung DeXで動作するAndroidアプリケーションの最適化

1年前、Samsung Galaxy S8 / S8 +スマートフォンが登場し、それに加えて、ユーザーが電話を本格的なコンピューターに変えることができるDeXドッキングステーションが登場しました。 これを行うには、電話機をステーションに置くだけで、接続されたモニターの画面にWindows 8以降のようなデスクトップが表示され、他の周辺機器(マウス、キーボード、プリンター)が使用可能になります。 MyOffice Documentsアプリケーションの革新的なアーキテクチャにより、 多大なコストをかけずに技術革新(DeXなど)を適応およびサポートできます。 このようなソリューションを実装するコストが低く、大画面でアプリケーションを使用できるユーザーの数が非常に多いことは特に喜ばしいことです。 この記事では、AndroidアプリケーションでDeXドックのサポートを実装する方法についての経験を共有します。







画像







Samsung DeXと連携するためのアプリケーションの機能を最適化する機能



技術的な機能を詳しく調べる前に、以下で説明する機能の多くは、Samsung DeXと組み合わせて使用​​するだけでなく、BluetoothキーボードやBluetoothマウスを接続するだけで使用できることに注意してください。 明らかに、接続された周辺機器でアプリケーションを使用する利便性のために、アプリケーション自体で多くの操作を実行する必要があります。 また、すべてのアプリケーションがデスクトップモードのサポートを必要とするわけではありませんが、使用の柔軟性が不必要になることはありません。







画像

出典: サムスン







さあ、行こう! まず、Samsung DeXで見栄えがよく、ユーザーが快適に作業できるように、アプリケーションで何を変更する必要があるかを簡単に考慮する必要があります。







そもそも、Samsung DeXはAndroid 7(Nougat)に登場したマルチウィンドウモードの改良版です。 つまり、アプリケーションがすでにこのモードで動作するように適合されている場合、ドックで起動するときに問題はありません。 ただし、デスクトップの下で完全に模倣するには、いくつかの機能を考慮し、以下の表に示され、メインと優先に条件付きで分割された追加機能を追加する必要があります。









Samsung DeXで起動されたアプリケーションは、ウィンドウのタイプに応じて3つのグループに分類できます。







  1. サイズ変更可能なウィンドウ。 つまり、アプリケーションはAndroid Nのすべてのマルチウィンドウ標準を完全にサポートします。
  2. 固定サイズのウィンドウ。 つまり、開発中にすべてのAndroid N「チップ」が考慮されたわけではありません。
  3. マルチウィンドウのサポートはありません。 さて、それは必要ありません。 Samsung DeXでは、このようなアプリケーションは明らかに動作しません。


実際、すべては次のようになります。









MyOfficeドキュメント







それでは、詳細を掘り下げましょう。







さまざまな画面ピクセル密度のサポート



上記のように、携帯電話で直接実行されているアプリケーション(Samsung Galaxy S8 / S8 +について話している)とドッキングステーションを介したブロードキャストには、それぞれ640 dpi(xxhdpi)と160 dpi(mdpi)の異なるdpi値があります。 したがって、ベクターグラフィックスを使用していない場合は、画像に適切なリソースを準備する必要があります。 また、レイアウトがフロートする可能性があることを考慮する必要があります。問題の解決策の1つとして代替レイアウトを準備する必要があります。 Android開発者向けの公式ドキュメントで、ピクセル密度の異なる画面の操作について詳しく読むことができます。







ウィンドウのサイズ変更とマルチウィンドウのサポート



アプリケーションのウィンドウのサイズを変更する場合は、各アクティビティのアプリケーションマニフェストに次のチェックボックスを追加するだけで、ディメンションを変更する必要があります。







android: resizableActivity = "true"
      
      





マルチウィンドウのサポート-「トリック」は新しいものではありません。AndroidNougatのリリースでは、多くの場合、それを固定するか、少なくともその方向を見ることができました。 すべては公式文書によく描かれています 。 この機能を実装するのは非常に簡単です。マニフェストにチェックマークを付けるだけで完了です。







 <application android:resizeableActivity="true"> </application>
      
      





マルチウィンドウモードに切り替えたり、その逆の場合、システムは必要なリソースを選択する必要があるため、アクティビティが毎回再作成されることを考慮する必要があります。 アプリケーションMyOfficeの条件では、Documentsアクティビティを再作成できないため、「recrereable」アクティビティのマニフェストで次のフラグセットを使用します。







 android:configChanges="orientation|keyboardHidden|screenSize|uiMode|screenLayout|smallestScreenSize"
      
      





この場合、必要なすべてのレイアウト置換は、たとえばonConfigurationChanged(Configuration newConfig) activity



メソッドで処理する必要があります。







デスクトップモードを終了するときのアプリケーションの寿命



DeXステーションを介してデスクトップモードになっているかどうかを確認する必要がある場合があります(通常はアプリケーションUIを変更するため)。 これは次のように行われます。







 public boolean isDexMode(@NonNull Context context) { Configuration config = context.getResources().getConfiguration(); try { Class configClass = config.getClass(); return configClass.getField("SEM_DESKTOP_MODE_ENABLED").getInt(configClass) == configClass.getField("semDesktopModeEnabled").getInt(config); } catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException e) { //   } return false; }
      
      





また、デスクトップモードを終了するときのアプリケーションの動作を設定するには、マニフェストの次のフラグが必要です。







 <meta-data android:name="com.samsung.android.keepalive.density" android:value="true"/>
      
      





以下の表は、フラグセットの有無にかかわらず、アプリケーションがどのように動作するかを示しています。















スクロール



デスクトップモードでのコンテンツのスクロールはマウスホイールによって実行され、 ListView



RecyclerView



GridView



またはScrollView



/ HorizontalScrollView



コンポーネントを使用すると、スクロール原理自体が自動的に機能します。 また、ユーザーが対応するコンポーネントを引っ張ってスクロールできるように、スクロールバーのサポートを実装することをお勧めします。 コンポーネントを実装している場合は、マウスホイールを使用してスクロールを追加することもできますが、これは少し下に記述します(スクロールバーの追加は非常に簡単です )。







マウスとキーボードの使用



マウスのサポートは、DeXドックで実行される多くのアプリケーション(マップとナビゲーション、ゲーム、この場合はドキュメントなど)で役立ちます。







MotionEvent



オブジェクトには、このイベントのソースを判別できるgetSource()



メソッドがあります。 コードでは、次のようになります。







 @Override public boolean onTouchEvent(MotionEvent event) { boolean isMouse = InputDevice.SOURCE_MOUSE == event.getSource(); ... }
      
      





マウスの右ボタンで要素にタッチが発生したことを理解するには、 getButtonState()



オブジェクトのgetButtonState()



メソッドを使用できます。







 boolean isRightClick = isMouse && buttonState == MotionEvent.BUTTON_SECONDARY;
      
      





これで、右クリックしてコンテキストメニューを開くことができます。







ただし、多くの電話モデル(Sumsung Galaxy S8 / S8 +ではありません)では、マウスの右ボタンを処理するための異なるロジックが実装されています。 したがって、これらの機能の実装はこれらのデバイスでは使用できません。







マウスでの作業は、ホイールでスクロールおよびズームすることが不可能な場合には完了しません。 次のコードスニペットは、マウスホイールの操作を示しています。







  @Override public boolean onGenericMotionEvent(MotionEvent event) { boolean isMouse = event.getSource() == InputDevice.SOURCE_MOUSE; if (isMouse) { switch (event.getAction()) { case MotionEvent.ACTION_SCROLL: float axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL); if (event.isCtrlPressed()) { //   Ctrl     zoomByMouse(axisValue); } else if (event.isShiftPressed()) { //       X scrollX(axisValue); } else { //    Y scrollY(axisValue); } break; } return true; } return false; }
      
      





行動シナリオは異なる場合がありますが、一般的なパターンは明らかです。







カーソル変更



クリック可能な要素の上にマウスを移動すると、カーソルの変化が受け入れられます。 この機能を実装するには、クリック可能なビューで次のフラグを設定する必要があります。







 android:state_hovered="true"
      
      





次に、 setPointerIcon()



メソッドを使用して、 setPointerIcon()



カスタムPointerIcon



をコードに直接インストールする必要があります( view.onResolvePointerIcon(...)



も参照)。







ハードウェアキーボードのサポートはより簡単です。デバイスに接続するだけです。 注目に値する唯一のことは、ホットキーの処理です。







  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.isCtrlPressed()) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_C: //  return true; case KeyEvent.KEYCODE_V: //  return true; } } return super.onKeyDown(keyCode, event); }
      
      





オプショナル



記事に記載されているほとんどすべての形式は、 公式のドキュメントに記載されています 。 サムスンは開発者に多くの追加の改善を提供します:









以下は、 OnDragListener



の実装例です。







 //      (   Android N  ) view.setOnDragListener(new OnDragListener(this)) public class OnDragListener implements View.OnDragListener { @NonNull private AppCompatActivity activity; public OnDragListener(@NonNull AppCompatActivity activity) { this.activity = activity; } @Override @TargetApi(Build.VERSION_CODES.N) public boolean onDrag(View view, DragEvent dragEvent) { switch (dragEvent.getAction()) { case DragEvent.ACTION_DRAG_ENTERED: return false; case DragEvent.ACTION_DRAG_EXITED: return true; case DragEvent.ACTION_DRAG_STARTED: return true; case DragEvent.ACTION_DROP: { DragAndDropPermissions dragAndDropPermissions = activity.requestDragAndDropPermissions(dragEvent); if (dragAndDropPermissions != null) { ClipboardUtils clipboardUtils = ClipboardUtils.getInstance(activity); String droppedPlainText = clipboardUtils.getClipboardPlainText(dragEvent.getClipData()); if (clipboardUtils.isRichTextInClipboard(droppedPlainText)) { // insert rich text } else { // insert plain text } } break; } default: } return true; } }
      
      







テスト中



これをすべてテストする方法は? 最も簡単な方法は、Samsung DeXドッキングステーションを購入し、すべての周辺機器を接続して楽しむことです。 何らかの理由でドッキングステーションが利用できない場合は、上記のように、Bluetoothキーボードとマウスをスマートフォンに接続するか、できればAndroid 7以降のタブレットに接続することができます。 エミュレータを使用したい場合は、Samsungが直接提供する方法を使用することもできます。







おわりに



確かに、鉄のように、Samsung DeXは興味深いデバイスであり、モビリティと、いくつかの動作中のデバイスをスマートフォンに置き換える必要があるユーザーの間で間違いなく需要があります。 私たちの経験によると、ほとんどすべてのアプリケーションは、このドッキングステーションでデスクトップモードで動作するように、またはハードウェアコントロールを接続するときに簡単に適応できます。 この記事がお役に立てば幸いです。








All Articles