はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

MAVIC AIRにも使えるDJI SDKを入手しよう

SDKの入手

現在のSDKはいろいろな種類がでていますが、MAVIC AIRで使うのであればMobile SDKに注目です。

https://github.com/dji-sdk/Mobile-SDK-Android

https://github.com/dji-sdk/Mobile-SDK-iOS

SDK自体はどこにあるかといえば、Mobile-SDK-Android-master\Sample Code\gradle\wrapper\gradle-wrapper.jarがSDKになります。

Xamarin.AndroidSDKを利用する

jarファイルをXamarinから呼び出すためには、バインディングライブラリを作成してjarファイルをまるっとXamarinのクラスライブラリでラッピングしてあげる必要があります。

image

jarファイルの追加

プロジェクトが生成できたら、Jarsフォルダを右クリックして[追加]-[既存の項目]メニューを選択します。

image

ダイアログが開いたらgradle-wrapper.jarを指定して、Jarsフォルダにgradle-wrapper.jarを追加します。

jarファイルのプロパティ指定

image

jarファイルに対するビルドアクションとして「EmbeddedJar」をしてしてdllにjarファイルを埋め込むようにします。

バインディングライブラリのビルドエラー対策

この状態でバインディングライブラリをビルドしてあげてエラーなくビルドできれば、バインディングライブラリのdllが完成します。

しかしながら、ここでエラーが出ないもののほうが少なく、gradle-wrapper.jarも当然のようにビルドエラーが発生します。

ビルドエラーは3件、すべてCS0535「〇〇はインターフェイスメンバー△△△を実装しません」です。

image

解決方法はいくつかありますが、今回出ているエラーは、「AbstractCommandLineConverter」、「AbstractCommandLineConverterInvoke」、「DownLoad」なので、主要な部分ではなさそうで使わないでもアプリ作れそうですから、とりあえずはなかったことにしてしまって、後日、必要だったらまた考えることにしたいと思います。

そのためには、Metadata.xmlに次の定義を入れておきます。

<remove-node path="/api/package[@name='org.gradle.wrapper']/class[@name='Download']" />
<remove-node path="/api/package[@name='org.gradle.cli']/class[@name='AbstractCommandLineConverter']" />

 

次回に続きます。

AndrodでGoogle Playに公開するときのSDKバージョン制限について

android-developers.googleblog.com

2018年8月以降

新規登録は、ターゲットSDKとしてAPIレベル26 (Android 8.0以上) が必須となります。既存アプリについては従来通りでもまだ大丈夫です。

2018年10月以降

上記に加えて、既存アプリのアップデートもターゲットSDKとしてAPIレベル26 (Android 8.0以上) が必須となります。

 

アップデートしないときはお目こぼしのようですが、現在提供中のアプリの更新を行わないというのも考えられませんので、既存アプリの名前を変更するなど(だとしても10月までにやらないといけない)して提供をキープして、主流派APIレベル26でということになるのでしょうか。

Androidアプリの有識者の方、ぜひ、教えてください。

 

2018年8月:APIレベル26(Android 8.0以上)をターゲットにするために必要な新しいアプリ。
2018年11月:APIレベル26以上をターゲットにするために必要な既存のアプリのアップデート。

Xamarin.Forms 2.xと3.0の違い(Xamarin.Forms.Application.Current.Resources)

App.csのコンストラクタで、Xamarin.Forms.Application.Current.Resourcesの初期状態が、Xamarin.Forms 2.xとXamarin.Forms 3.0では異なっていました。

2.x:null

3.0:not null

問題点

そのため、nullだったらCurrent.Resourcesに項目をAddするようなロジックにした場合、2.xでは正常に動作し、3.0ではAddしないため、XAML

BackgroundColor="{StaticResource BorderBrush}"

のような参照をしていると、そこで実行時エラーになってしまいました。

対策

if (Xamarin.Forms.Application.Current.Resources == null || Xamarin.Forms.Application.Current.Resources.Count == 0)

のようにCount判定も追加する。

Xamarinの共有プロジェクトでXamarin.Forms 3.0を使う

Xamarin.Formsも3.0となり、魅力的な機能がさらに追加されました。

主な新規のは次のようなものがあります。

  • FlexLayout
  • ResourceDictionary
  • 右から左(アラビア語など)のサポート
  • CSS StyleSheet
  • Visual State Manger

Microsoft XAMLではおなじみの「ResourceDictionary」や「Visual State Manager」のサポートもうれしいですが、「FlexLayout」と「CSS StyleSheet」のサポートも魅力的ですね。

例えば、FlexLayoutはコンテンツを折り返しならが横方向に並べてくれるレイアウトで、Gridのようにあらかじめ縦横のマス数を指定しなくてもいいので、可変数のコンテンツを効率よく表示するのに適しています。従来であれば、ListViewのように横幅が一定の1列リストなどしか方法がありませんでしたが、タイル状に表示することが可能になりました。

Xamarin.Forms Layout Types

 

新規プロジェクトでのXamarin.Forms 3.0の指定

Visual Studio 2017 (15.7.2)で新規に作成したプロジェクトでXamarin.Forms 3.0を使う方法を紹介します。Xamarin.AndroidとXamarin.iOSに共通のロジックは.NET Standard 2.0でDLL化して共有するのではなく、共有プロジェクトでソースコードレベルで共有するスタイルにします。

image

そのためには、CrossPlatform - Xamarin.Formsテンプレートを選択して、空のアプリで「共有プロジェクト」を選択します。

image

 

この方法で作成したプロジェクトでは、Xamarin.Formsは最初から3.0が設定されています。Xamarin.Formsもnugetパッケージとして提供されていますから、ソリューションエクスプローラーでAndroidのプロジェクトの[参照]フォルダを右クリックして[Nugetパッケージの管理]メニューを選択して、使用されているnugetパッケージのバージョン確認してみましょう。

image

Xamarin.Forms 3.0のnugetパッケージの最新化

テンプレートのXamarin.Forms 3.0は3.0.0.482510ですので、その後に新しいものがでている場合があります。今回も、2018/06/05に3.0.0.530893がでているので、必要に応じてnugetパッケージん更新をしましょう。更新していいかどうかの判断基準は一概にはありませんが、リリースノートなどで判断するのがいいでしょう。

https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-3.0/3.0.0/

 

Xamarin.Androidのサポートライブラリの最新化

Xamarin.Androidの場合、さらにXamarin.Android.* (サポートライブラリ)のnugetパッケージのバージョンをどうするかも考える必要があります。

テンプレートで指定されてるサポートライブラリのバージョンは、25.4.0.1となっており、この時の依存関係にあるMonoAndroidバージョンはv7.0となっております。

2018/6/6現在に対応している最新MonoAndroidバージョンはv8.1ですので、最新のものを使うなら、サポートライブラリを最新のv27.0.2にします。

 

サポートライブラリとAndroid SDKのバージョンの関連

サポートライブラリのバージョンを更新してMonoAndroidのバージョンが変更されたときは、該当するAndroid SDKがイントールされている必要があります。

たとえば、サポートライブラリをv27.0.2にしたいのであれば、事前にAndroid SDK ManagerでSDK 8.1がインストールされていることを確認してください。

image

該当するSDKバージョンがないとnugetでサポートライブラリのバージョンを更新するときにエラーとなります。

image

ターゲットフレームワークの関連

Android SDK v8.1がインストール出来たらプロジェクトのターゲットフレームワークAndroid 8.1にします。

image

こちらターゲットAndroidバージョンとは別となります。もし(そんなタイミングはすくないでしょうけれど)、ターゲットを最新OSにするのを待ちたいときは、ターゲットAndroidバージョンを明示的に指定することも可能です。

image

2つ指定するのが面倒であれば、SDKのバージョン=ターゲットAndroidバージョンにする「SDKバージョンを使用したコンパイルの使用」という指定もあります。

image

 

Xamarin.Formsで画面を定義してみよう

それでは試しにFlexLayoutを使った画面を定義してみましょう。

画面定義は、AndoridとiOSで共通化できるところは共有プロジェクト側に記載します。

image

>|html|
<!--?xml version="1.0" encoding="utf-8" ?-->
<contentpage x:class="XamarinForms3Sample.Views.MainPage" xmlns:local="clr-namespace:XamarinForms3Sample.Views" xmlns:converter="clr-namespace:XamarinForms3Sample.Converters" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns="http://xamarin.com/schemas/2014/forms">
        
    <grid>
        <scrollview>
            <flexlayout justifycontent="SpaceAround" wrap="Wrap" x:name="Flexbox">
                <img />
            </flexlayout>
        </scrollview>
        <activityindicator x:name="activityIndicator" verticaloptions="Center" isrunning="{Binding IsBusy}">
    </activityindicator>
</grid>
||<

Modelなどのロジック部分も完成して実行すればタイル状に画像が表示されるアプリの完成となります。

image

 

ところでFlexLayoutでViewModelとBindingするのはどうするだろう。

 

build 2017雑感

build 2017も残すところあと1日となりました。

1日目、2日目のキーノートとセッションに参加して感じたことは、AI - Cognitive、HoloLens、Xamarinということでしょう。

そしてすべてのセッションには英語字幕がついている(これ、音声認識なのか、どこかに会場音声を飛ばしてキー入力している人がいるのか不明。後者なのかな)点も見逃せませんでした。

今回の会場は道路を挟んで2つの建物で行われていました。キーノートや展示会場もあるWCC側のセッションでは手話通訳者の人がスピーカーの話す内容を手話にしていました。もちろん、キーノートでも。

AI - Cognitive

 画像認識を使って危険予知や体調を推測するなど、Cognitive Serviceで提供されている機能を使うことで、人の気配りを機械にさせることができるようになるかもしれません。

疲れることも気分にも左右されない機械がいろいろなところに入ってきて、それによって生まれた余裕を使って臨機応変の部分で人が対応できるような未来が感じられるのが今年のbuildの特徴の1つでしょう。

そしてもう一つの未来がキーノートで紹介されたマイクロソフトリサーチの研究

youtu.be

パーキンソン病の症状の1つである手の震えを二軸のモーターで相殺する腕時計デバイスです。動画中にもあるような小型化できたのも、機械学習による成果と言えるでしょう。

HoloLens - Microsoft Mixed Reality

今までは文字通り箱入り娘のようだったHoloLensですが、今回のbuildの展示会場では、普通のブースにもHoloLensを展示している企業さんがいて、HTCやOculusのように気軽にかぶせて自分たちのアプリを体験させていました。

そして、Microsoft Mixed Realityに準拠したAcerHMDの体験コーナーもありました。AcerHMDですが、HoloLensのように単体動作ではなく、PCに接続して使う従来型のHMDです。ですからHoloLens向けに作成したアプリをローカルコンピュータで実行すればAcerHMDに表示されるという寸法です。

Mixed Reality AcademyでもHoloLensとAcerの両方が試せました。同じアプリが両方で試せるのは素晴らしいですね。Acer HMDですが今までにない綺麗さでした。いわゆるフルダイブ型ですが装着感もいいし、これでVRコンテンツをプレイしたら楽しいかなと思いました。

Xamarin

そして今年もXamarin界隈は元気ですね。セッションもたくさんあるし。

Visual Studio for MacがGA(正式提供)されたり、Xamarin Live PlayerやXAML Standardなどのいままでかゆかったところに手が届くような発表もあり、今後もXamarin界隈は元気な感じですね。

■Xamarin Live Player

AndoridやiOSでの実行(画面表示?)をシミュレートしてくれるインタープリター環境です。VMのように重たくもないし、実機デプロイと違って、Visual Studio側での変更もリアルタイムに反映ができます。

もちろん、シミュレーターや実機のように厳密には動作が違う部分もあるかもしれませんし、(実はインタープリターなのでMacなくてもPCだけで)iOS画面が確認できるといっても、まだまだ基本的なXAMLページしか対応できていないし、実機デプロイやストアへの登録はMacが必須なのは変わりませんが、この方向が示されただけでも、また、初学者の人が入門記事を試すのにも最適化なんじゃないかな。

XAML Standard

現状、Microsoft XAMLとXamarin XAMLは同じように書けそうで、コントロール名が違っていたり、プロパティが違っていたりします。そこで、XAML Standardという考え方を入れて共通化していきましょうというものです。

私としては、コントロール名やプロパティ名を共通化するときに、全部、Microsoft XAMLによせるのではなくて、例えば、VisibleプロパティなんかはIsVisibleプロパティのようにXamarin XAMLにしてもらった方がConverter書かなくていいのになーと思ったりするので考慮してほしいなぁーと思ったりもしています。

それ以上に期待するのが、各プラットフォームごとに動きの差異が最小になるようにしてほしいという点です。それができるならば、コントロール名やプロパティ名が違うくらい外側の話ですから使う側でいくらでも補完できます。

若干、今回のXAML Standardの発表を否定的にとらえているようなコメントもTwitter上で見かけますが、build現地の空気感や使う側の開発者にしてみれば、XamarinがMSに買収されたときから【長い間】「こうなるはずだよね?」と思っていたことが【やっと公式に表明】されたという点が大きいわけで、個人的にはそれこそ去年のbuildで表明されてもよかったくらいだと思うので、それは素直に評価して喜んでいいじゃないかって思うところです。

Xamarinで作ったAndroidアプリをGoogle Playストアに登録する

Visual StudioでXamarinを使ってAndroidアプリを作成してストア登録するときの手順が最近(2017年3月末)変わりました。

以前の方法

以前であれば、[ツール]-[Android]-[Publish Android Application]メニューでダイアログを立ち上げて、そこでKeystoreなどを選択してapkファイルを作成しました。

そして、apkファイルを手動でGoogle Play Developer Consoleにアップロードして公開していました。

新しい方法

新しい方法では、ソリューションエクスプローラーでAndroidアプリのプロジェクトを右クリックして、そこで[Archive]を選ぶ方法に変更されました。

[Archive]メニューを選ぶとArchive Managerが立ち上がり、該当プロジェクトのアーカイブが進行します。

image

この時、ソリューション構成は[Release]を選択しておきましょう。

 

ビルドがうまく通ればapkファイルが所定のフォルダに作成されます。

image

ただし、このapkファイルは未署名のものなので、そのままではGoogle Playストアに登録できません。

[Distribute]ボタンを押して署名を行いましょう。

Select Channel

Ad HocなのかGoogle Playなのか配布方法を選びます。Google Playストア経由で配布するので[Google Play]を選択します。

image

Signing Identity

署名を行います。

Keystoreファイルがすでにあるならば[Import]ボタンをクリックしてファイルを取り込みます。

image

既存のKeystoreファイルがないのであれば[+]ボタンをクリックして、新規にKeystoreファイルを作成します。

image

Alias:別名など(プロジェクト名とか)

Password:パスワード

Validity:25以上の数字。1000とかでもOK。

Full Name:発行者のフルネーム

Organization Unit:部署名(個人なら入力しないでもOK)

Organization:会社名(個人なら入力しないでもOK)

City:市区町村区名

State:都道府県名

Country Code:JP

Google Play Accounts

Google Playストアに登録するアカウントを指定します。

image

Google PlayストアにログインしているIDとパスワードではなく、Google API AccessのClient IDとClient Secretを指定します。

image

これにはGoogle Play Developer Consoleにログインして「APIアクセス」のところでOAuthクライアントを作成してその認証情報からコピペします。

image

Google Play Track

ここまでできたら、アルファ版、ベータ版、段階的公開、製品版のどれで公開するかを指定します。

image

少し説明が必要そうなのは、段階的公開(Rollout)でしょうか。これはバージョンアップ版の公開を一度にすべてのユーザに対して公開するのではなく、徐々に公開していく方法です。

こうすることによって、致命的な障害があった場合に全台に影響がないようにします。また、新バージョンの最初の起動の時だけにアクセスするようなデータがあった場合の負荷分散にもなります。

段階的公開が必要なくらいの利用者数があるアプリとか夢のようですよね。

 

新しい公開方法は以上です。

以前に比べるとGoogle Play Developer Consoleへの配置までできるので便利ですね。

Xamarin.AndroidやるならJava8とAndroid SDK Build-Tools 25以上で決まりっ!

Android開発はJavaな訳ですが、Android 6.0 (API 23)まではJava7、Android 7.0 (API 24)からはJava8が使えます。

では、Xamarinはというと2016年の夏くらいに、Android SDK Build-Tools 25あたりでちょっといろいろありましたが、今現在では、もう安定しているので、今から始めるならば、JDK8 (x86)をOracleのサイトからダウンロードしてきて、Android SDK Managerで、

と、必要なSDK Platformのインストールしておくといい感じですね。