Yandex.Disk for AndroidおよびWindows用のフォトフレームの設計

e-Legionでは 、開発の世界で発生するすべてを監視し、プロジェクトのさまざまなソリューションを常に試行しています。 アプリケーション開発市場で8年間、さまざまなプラットフォーム向けのさまざまなプロジェクトを引き受け、Habréで最も興味深い事例について話をしようとしました。



私たちは3年以上にわたってYandexと協力してきましたが、この間、サービスと国の主要な検索のエコシステム全体に染み込んでいます。 そのため、昨年10月にYandex.DiskのSDKが発表されたとき、彼は何ができるのかと考え、AndroidとWindows用のシンプルなPhotoFrameアプリケーションを開発することにしました。







アプリケーションのアイデアは単純です。写真をYandex.Diskにアップロードし、アプリケーションをアカウントと同期して、スライドショーを取得します。 友人や両親と写真を共有するには、デバイス上でアプリケーションを設定し、Yandex.Disk上の写真とフォルダを共有するだけです。 写真は他のデバイスの「フォトフレーム」に自動的に表示されます。 一般に、一度試してみるほうが簡単です。





私たちの目標は、友人や親friendsと新しい写真を簡単に共有するためのシンプルで便利なアプリケーションを作成することでした。そのため、プログラムのインターフェイスはできるだけシンプルで明確になりました。 最初の起動時に、ユーザーが同期するディレクトリを選択し、いくつかの標準設定を変更できるウィザードが表示されます。 同期するフォルダを選択した後、「フォトフレーム」はディレクトリ構造全体を再帰的にスキャンします。 次に、ファイルがフィルタリングされ、画像ファイルのみがユーザーのデバイスのキャッシュにロードされます。



同期操作が完了すると、「フォトフレーム」は定期的にサーバーをポーリングして、ディレクトリ構造またはファイルの変更を表示します。 変更が検出されると、同期メカニズムが再起動します。 ユーザーがインターネットに接続していない場合、「フォトフレーム」はオフラインで動作します。サーバーとの同期を除くすべての機能は動作し続けます。 ところで、Windowsアプリケーションには素晴らしいボーナスがあります。スクリーンセーバーをカスタマイズし、デスクトップの壁紙を自動的に変更する機能です。 これは、レジストリ内のいくつかのパラメーターを変更し、WinAPI関数を呼び出すことで簡単に実装できます。





PhotoFrameのWindowsバージョンは、.NET Framework 4.0のC#で作成されました。 .NET Frameworkの最新バージョンではないという選択は、Windows XPのサポートによるものです。







クライアントアプリケーションは、MVVMデザインパターンを使用してWindows Presentation Foundation(WPF)の上に構築されます。 Photo Framesインストーラーは、Windows Installer Xml(WiX)ツールキットを使用して作成されています。



Android



Androidアプリケーションは、2.3以降のバージョンで動作します。 「フォトフレーム」アプリケーションの開発中、Android 4.4で導入されたいわゆる没入モードと呼ばれる画面の「スライドショー」の実装を試みることにしました(詳細については、 habrahabr.ru / post / 200874を参照)。 しかし、私たちの目標は、バージョン4.4だけでなく、うまく機能するアプリケーションを作成することでした。 Android 4.xの以前のバージョンでは、ステータスバーと画面上のボタンの両方を非表示にすることができました(4.3のYouTubeアプリで実装されていたため)。 イマーシブモードがバージョン4.4でアクティブな場合、画面のタップはTouchEventを呼び出しますが、バージョン4.3のフルスクリーンモードでは、最初のタップはモードを終了し、2番目のタップのみが既にクリックされたビューに到達します。 私たちのタスクは、画面上のタップをキャッチし、画像の上に追加のレイヤーを表示することでした。したがって、この最初のタップをキャッチする必要がありました。

4.3で全画面モードを終了する方法を知るには、アクティビティでgetWindow()。GetDecorView()を呼び出し、結果のビューにリスナーsetOnSystemUiVisibilityChangeListener(...)を配置する必要がありました。







しかし、これでもそれほどスムーズではありませんでした。 onSystemUiVisibilityChangeメソッドが呼び出されたのは、テープに貼り付けてフルスクリーンモードを終了してから1秒後にのみでした。 したがって、このアイデアを完全に放棄し、バージョン4.4までのデバイスの画面上のボタンを非表示にする必要がありました。 その結果、4つではフラグfullscreenとlow_profileを設定し、他のデバイスでは2.3または3.xで-フルスクリーンのみを設定します。



Yandex.Disk SDK



Windows SDKは.NET 4.0用のC#で記述されており、いくつかのVisual Studioプロジェクトで構成されています。 これらのプロジェクトの中には、プラットフォームごとに独自のアプリケーションを実装する例があります。 SDKは、Windows Phone 7.5以降、Windows StoreおよびSilverlight 4以降のアプリケーションの開発に変更せずに接続します。 Windowsのサンプルプロジェクトを見ると、Yandex.Diskを使用して「フォトフレーム」の動作のロジック全体を構築することは難しくありませんでした。



ユーザー認証は、OAuthプロトコルまたは基本認証を伴うオプションの認証を使用して実行されます。 サーバーと同期するために、GetListAsyncとDownloadFileAsyncを使用しました。 すべてのメソッドが非同期であることがわかります。これは間違いなくプラスです。



Windows SDKの操作中に、小さなエラーが見つかりました。 2ギガバイトを超えるファイルがYandex.Diskにある場合、GetListAsyncメソッドはこのディレクトリからファイルのリストを返すことができません。 SDKのソースコードでは、問題をすばやく検出できました。Int32の最大許容値を超えました。 その結果、決定には5分しかかかりませんでした。







Androidでは、SDKはプラグ可能なライブラリです。 そのすべての機能は、GitHubリポジトリのSDKと共に配布されるサンプルアプリケーションで詳細に説明されています。 また、アプリケーションに認証を実装する方法の最も最適な方法も示しています。最初に、デバイス上で既存のYandexアカウントが検索され、ユーザーは公式のYandexアプリケーションのいずれかを使用してログインします。 そうでない場合は、アカウントログインページでブラウザにユーザーを送信する必要があります。



最初に、 対応するページで OAuthアプリケーションを作成する必要があります 。 同じ場所で、「コールバックURI」フィールドに何らかのURLを入力します。このURLに戻り、intent-filter承認のアクティビティを通じてアプリケーションでキャッチします。 したがって、SDKと連携するために必要なaccess_tokenを取得します。

「フォトフレーム」に画像をダウンロードするには、APIメソッドを使用する必要がありました。これにより、画面サイズに対応する必要な低解像度で画像を受信できます。 残念ながら、現在のバージョンのSDKのこのメソッドへのアクセスはまだ実装されていないため、ファイルをダウンロードするメソッドを少し調整し、追加のパラメーター「サイズ」を渡す機能を追加する必要がありました。



SDKソースコードは、WindowsおよびAndroidのリンク介してGitHubからダウンロードできます。



おわりに



すべての開発には1か月以上かかりました。 その結果、写真のスライドショーをすばやく作成し、それを家族や友人と共有するのに役立つ簡単なアプリケーションを入手しました。



アプリケーションは既にリリースされていますプロジェクトの説明ページのリンクを使用してダウンロードできます



フィードバックや質問を歓迎します。



All Articles