ラベル Androidプログラミング の投稿を表示しています。 すべての投稿を表示
ラベル Androidプログラミング の投稿を表示しています。 すべての投稿を表示

2019年11月25日月曜日

近況

最近開発に没頭していたので、更新が滞ってます。
販売しているAndroidアプリに新機能を搭載することにしたので、そのための調査とコーディングが大変なのです。
XamarinのプロジェクトにJavaソースを加えて、C#からJavaをコールする方法(Managed Callable Wrapper、通称MCWが必要)や、C++ソースを加えてJNIで呼び出す方法など、色々勉強になりました。
C++のライブラリ(.SO)側でSignalを発行するような致命的エラーが発生した場合に、これをAndroidのVM側で検知する方法がまだわかりません(エラーと同時にアプリも落ちてしまう)。
C++側でSignalハンドラをフックして、Javaの例外に変換する方法があるようなのですが、JavaVM自体はSignalハンドラを利用して色々やっているらしく、ハンドラをフックするとハングアップするなど、うまくいきません。
平日は2時間くらいしか時間が取れず、土日も色々忙しいので…。

2019年11月9日土曜日

Xamarin デバッガーが動かなくなる

Xamarinのデバッガーが動かなくなった…。
メッセージは以下の通り。
デバッガーに接続できませんでした。詳細については Xamarin 診断出力を、例外の詳細についてはログをご覧ください。
色々ググってプロジェクトプロパティ→Androidオプション→共有ランタイムの使用のチェックを外したら動いた。
設定→アプリで、Mono Shared RuntimeとXamarin.Android API-28 Supportをアンインストールしたら、「共有ランタイムの使用」「Fast Deployment」を戻しても大丈夫になった。時間を1時間ほど浪費した。
最近Xamarinに悩まされることが減りましたが、久々にやられました。
疲れた。

2019年11月2日土曜日

XamarinでTargetSdkVersion28対応


11月に入ったので、GooglePlayの要件で今後のバージョンアップ時はAndroid9対応(TargetSdkVersion=28)にしないとアップロードできなくなります。
ということで先送りし続けてきた対応作業に入ります。
ネットで検索した限りでは、9からはフォアグラウンドサービスを使用するアプリには、新たにパーミッションが必要とのこと。デンジャラスパーミッションではないので、マニフェストで宣言するだけで終了です。



まずはアプリケーションのターゲットフレームワークをAndroid9に変更。こちらはXamarinの設定になります。
これでAndroidマニフェスト設定画面に新しいパーミッションが表示されるようになります。ちなみにAndroidのTargetSdkVersionと同じにしないとXA1008のWarningが出ます。

こちらが本命の設定。
さっそく再コンパイルしてAndroid9のエミュレータでアプリを起動してみます。

…あっさり動きました。

あれっ。こんなに簡単に終わるんだっけ。Android8.0のXPERIA実機でも問題なく動きました。もうちょっとAndorid9の変更点を確認してみます。


2019年10月21日月曜日

Xamarin Android App Bundle エラー

Xamarinがコンソールレベルで、Androidの新しいアプリ公開パッケージ方式であるAndroid App Bundleに対応しているので試してみました。

ココを参考にさせてもらって、aabファイルが出来たまでは良かったのですが、いざPlay Consoleで登録して公開後、手持ちのスマホでダウンロードしてみたら、インストールはできたものの、起動直後に「問題が発生したため、XXXXを終了します。」となってアプリが起動しない。

先週公開されたXamarin 10.1 preview releaseでは、ようやくIDEがAndroid App Bundleに対応し、アーカイブ機能も対応したようです。もうちょっと待とうかな。10月中にAndroid App Bundleでバージョンアップ版を公開したいのですが…。

Android9対応期限である11月1日の前にバージョンアップ版を公開したいので原因調査してなんとか対応させることにしました。まずはVisual Studioを16.3.5にアップデートし、Xamarinを10.0に。Androidオプションにaapt2の設定が出現しました。
csprojでAndroidPackageFormatをaabに設定すれば、強制的にaapt2がtrueに設定されるらしいのですが。
ということで、再度msbuildを実行。aabファイルができましたが、これまでより若干サイズが大きい。さっそくPlay Consoleにアップロード。今度はいけるか?


ダメでした。
---
その後、クラッシュレポートのスタックトレースにヒントを発見。
resources/rawフォルダ内のファイルに対して、NotFoundExceptionが発生しているので、とりあえずrawフォルダとリソースを参照するロジックをカット。これでエラーは回避できましたが、さらに広告絡みのエラーが出ました。インストール後の初回起動時のみエラーが発生するという不可解な現象ですが、ネットで事例がチラホラ。
com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver
のClassNotFoundExceptionです。
こちらはAndroidの不要コードを削除する機能(ProGuard)の問題で、当該クラスの削除抑制を指示することで対応可能なようです。configに追加オプションを書けばいいらしいのですが、R8を指定している場合も、互換があるので同じで良さそうです。
以下のオプションを追記します。

-keep class com.google.android.gms.** { *; }
-keep class com.google.firebase.** { *; } 

Xamarinの場合はAndroidSDKのフォルダにある..\tools\proguard\proguard-android.txtに追記してやれば良いみたいです。

諦めかけましたが、何とかApp Bundle対応できてよかった。
ということで次はAndroid9(minSdkVersion=28)対応です。
SupportLibraryからAndroidXへの移行はどうしようかな…。

2019年6月27日木曜日

Android9対応

アプリのバージョンアップ版公開時に、Googleさんから。
「11月からアプリの更新では、APIのバージョンを28にしないとダメです。」
と、警告されてます。半年以上前から。
TargetSdkVersionを26から28にしないといけないわけです。
64bit版のモジュールも用意しろと言われているので、そろそろ本気で調査を始めないといけません。
開発端末のXperiaXZが9にバージョンアップしてくれないので、動作確認ができず、イマイチやる気が出ない。
でも最近9の利用者がダウンロードしてくれることが多いので、対応はしないといけないと思っているのですが、実機がないと不安。エミュレータで動作確認するか、安い9スマホを買うか。ファーウェイ!?


2019年5月27日月曜日

Xamarin.Androidでアプリ 64bit対応

Googleからメールが来ました。
公開しているアプリを8月1日までに64bit対応版もリリースするように!
という通告です。
Xamarin.Androidで対応するには?

オプションで「サポートされているアーキテクチャ」に「arm64-v8a」を加えるだけでいいんでしょうか?

→いいようです。

2019年4月8日月曜日

VS2019でXamarinのエラー

プロジェクトのプロパティのうち、「ビルド」「ビルドイベント」「参照パス」を開こうとすると以下のようなエラーが…。
==
ページの読み込み中にエラーが発生しました。
ファイルまたはアセンブリ'Microsoft.VSDesigner, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。
==


なんのことやらさっぱりわかりません。
VS2019のメニューから、ヘルプ→フィードバックの送信→問題の報告で、キーワード「Microsoft.VSDesigner」を検索すると何やら出てきました。
どうもインストール時にXamarinだけではダメなようで、.Netデスクトップ開発のパッケージ群も必要のようです。

インストーラを起動して.Netデスクトップ開発を選択。オプションは最低限の.NetCore2.1開発ツールのみで、追加インストールしたところ、エラーは出なくなりました。
この追加インストールによって、Xamarinの画面デザイナーのエラーも解消し、正常に表示されるようになりました。依存関係があるなら、インストール時にナビゲートしてくれないと。
→その後またエラーで表示されなくなっちゃいました。
→Version 16.0.1に更新したら表示されました。これで直ったかな?



2019年4月6日土曜日

Xamarin.Android Visual Studio 2019 Community

Visual Studio 2019は起動がとても速くなりました。
メモリの使用量も4分の1になったらしいです。
Xamarin.Androidで開発しているアプリですが、既存プロジェクトではデザイナーがうまく動かないのかなぁと思い、スケルトンプロジェクトを作成してみました。
Xamarin.Androidで空のアプリを作成してみたところ、

こんな感じでいきなりエラーだらけになります。でもソリューションを一旦閉じて開くとエラーはなくなります。
なんでしょうね。CPUとディスクが高速過ぎるので、プロジェクト作成後のコンパイル時に参照ライブラリの解決とコンパイルの同期がうまくとれないとか?
Xamarin.Essentialsが使われたコードになっているのもどうしてなのでしょう?
iOSとかでも動くクロスプラットフォーム用のAPIですよねぇ。
VS2017でもソリューションを作ってみましたが、Essentialのコードは入りません。
テンプレートのバグ?

2019年4月4日木曜日

Visual Studio 2019 CommunityでXamarin

本日Visual Studio 2019の正式版がリリースされました。
無償版のCommunityも同時ということで、さっそくXamarinを2017から2019へ更新です。


インストーラのメニューからXamarinのみを選択。
オプションのAndroid SDK セットアップのチェックは外して、後から既存のAndroid SDKインストールフォルダを指定しました。
5分くらいでインストールは完了。
起動すると2017のソリューションが自動で表示されるので、ソリューションを開いてみました。
最初にAndroid SDKがないよ的なエラーが出たので、ダブルクリックでSDKのフォルダを指定。何故かエラーがなくならない。


とりあえずAndroid SDK Managerを確認して、Android Build Toolsをインストールしてみる。


これでもダメだったので、Visual Studioを再起動したらエラーが消えました。
Build toolsは入れなくても良かったのかもしれませんが、エラーがなくなったのでいいか。
さっそくプロジェクトを再コンパイルしてXperiaにデプロイしてみましたが、あっさり動きました。
コード補完でAIが支援してくれるらしいです。まだコーディングしていないのでどんな感じかよくわかりませんが。
Xamarin.Andoridの実行コードも少し早くなっているとかいないとか。
無茶苦茶重くてすぐエラーが出るGUIのデザイナーは、かなり進化したらしいですが、私のアプリの複雑な画面はやはりエラーでまともに表示できませんでした。

2019年2月12日火曜日

アプリ開発

ようやくメインの改良プログラミングが終わりました。
相当機能追加や変更を行ったので、テストをしっかりしないと。
といってもテストをしながら作っているのでバグは殆んどなく、古いOSの端末で動くかの確認がメインです。
今回はプロモーションビデオを作成する予定です。まだしばらく忙しい日々が続きそうです。

2018年9月16日日曜日

アプリ最新OS対応完了

GooglePlayは11月から、Androidのバージョン8(通称OREOオレオ)に対応していないと、アプリを公開することができないようになります。
具体的にはアプリのtargetSdkVersionをOREOのAPIレベル26以上にする必要があります。
アプリが新しいOSで動作する際は、新しいOSの機能やセキュリティ要件に対応していないと公開できなくなるというわけです。
平日の会社からの帰宅後や休日に調査と改良を行い、2週間近くかかってようやく対応が完了しました。
ようやく対応できたのですが、早くも先月新しいAndroidOSのバージョン9(通称PIEパイ)が公開されたので、また9に対応させる改良が必要になります。
このGooglePlayの仕様変更に様々なアプリが対応を始めていますが、アクセス権設定やブロードキャストと呼ばれるグローバルなイベントの取り扱いの変更によって、うまく起動できなくなるアプリも増えているようです。
特にマルチメディア関係の仕様がかなり変更になっていて対応に苦労しました。
もう少し自分で使ってみて、問題なければ更新アップロードしようと思います。

2018年9月4日火曜日

GooglePlay仕様変更

アプリ開発者がAndroid用のアプリを公開するGooglePlayの仕様が変更になります。
常に新しいバージョンのアンドロイドOSに対応しないと公開できないようになるのです。
新規のアプリは既に8月から始まっており、既存のアプリの更新も11月からそうなります。
私のアプリも対応が必要で、現在改修中なのですが、一部の機能が動かず苦戦しています。
これから開発者は常にOSの仕様変更に追従しなければならず、苦労しそうです。

2018年1月16日火曜日

Xamarin デバッグ実行時エラーでハマる

プログラムに問題がないのに、何故かデバック実行時に謎のエラーが発生する。
Classが見つからないというエラーが多い気がしますが、そういう場合はクリーンを実行すると直ったりします。
デバッグを高速にするFast Deployment機能が影響しているのかもしれません。
この謎のエラーで4,5時間デバッグして、諦めかけた頃にこれに気付きました。
何か問題が起きたら、慌てずにまずはクリーンで一時ファイルを削除してから実行する習慣をつけた方がいいです。

2018年1月12日金曜日

高速フーリエ変換

スペクトル解析で必須となる計算で、離散フーリエ変換のアルゴリズムだそうです。
言葉を聞いただけで思考停止して眠くなるのですが、最近これと格闘しています。
実数、虚数、複素数とか常用対数とか出てきて文系の私には辛いものがありますが、頑張ってやり遂げたい。
学生時代にインチキで作ったものを今度はちゃんと作りたいのです。

2018年1月2日火曜日

Xamarin ProGuradでハマる

Xamarinで開発したAndroidアプリをGooglePlayで公開する場合には、パッケージ(APKファイル)を最小サイズにするために、ProGuardというJavaのツールを使って、使用しているクラスだけに絞る最適化を行います。
ところがVisualStudio2017Community+Xamarinで開発したアプリを、ProGuardを有効にしてAPKを作って実機で実行すると起動時にエラーで落ちたり、真っ暗な画面で起動しなかったりで苦労しました。
XamarinのProGuardは、プロジェクトプロパティのAndroidオプション画面で指定するのですが、ProGuardを有効にする場合には、同じ画面の他のオプションにも注意が必要らしいです。
まずProGuradはリリースコンパイルの時にのみONにすればいい機能なので、ビルド構成をReleaseにします。
で、ProGuard以外のパッケージプロパティは全OFF(メソッド数が65535を超える場合は要Multi-Dex。※KitKatでは注意が必要らしい)。で、リンカープロパティは、「SDKよびユーザーアセンブリ」にしておく必要があるらしい。
この状態でビルドすると、確かにAPKは小さくなるが実機で動かない。
どのくらい小さくなるかというと、リンカープロパティでリンクなしにすると50MBくらい→7MBくらい。
小さくなって動かないのじゃ仕方ない。デバイスログを見たり色々したのですが原因不明で数時間調べたのですが、ProGuardオプションをOFFにしてビルドしたら、数百バイト大きなAPKができて何故か正常に動いた。さっぱり原因がわからん。
という感じで元旦からプログラミングしてます。




2017年12月23日土曜日

自作音楽プレイヤー機能追加

久しぶりのプログラミングが楽しい。
最近新しい機能を追加しました。iPodにも無かった画期的な機能です。
曲の途中(ランダムな位置)から一定時間再生する機能。シャッフルと組み合わせるとこれまでにない音楽鑑賞が楽しめます。曲の切り替わりはもちろんフェードアウト&インでいい感じに繋がります。
音楽を聞き始めた中学くらいからため続けた約2000曲は整理もされていないので、聞きたい曲を選ぶのが困難です。シャッフル演奏でお任せにすることはできますが、イントロが流れると、
今この曲の聞きたくない!が大半で、曲を聞いてるより曲送りしてる方が長い、という状態になります。
ところがこの機能では、いきなりサビの部分など途中から始まるので、新鮮な気持ちで聞けます。少し聞いていればすぐ別の曲になるので、最初からだと聞かない曲も、もう少し聞きたかったなーという感じになります。
そういう時のために、前曲ボタンで最後まで聞く、さらにもう1回押すと最初から最後まで聞くこともできるようにしました。

2017年12月19日火曜日

Xamarin+Visualstudio2017 NuGetでハマる

自作音楽プレイヤーの演奏用ライブラリを最新のExoPlayerV2に変えてみようかと、NuGetで探してみると、Xamarinで簡単に使えるようにするプラグインがありました。
Xam.Plugins.Android.ExoPlayer
ExoPlayerはJerryBean(4.1)以降で使えるJavaライブラリなので、うちのXperiaZL2のKitKat(Android4.4)でも使えるはずなので、本体ライブラリをダウンロードしてみました。
ところがライブラリが依存しているXam.Plugins.Android.ExoPlayer.Dashが、Xamarin.Android.Support.Core.Utilsの少し高いバージョンを要求しており、プロジェクトの追加がエラーに。
そしてこれを機にXamarin.Android.Support.Core.Utilsがプロジェクトから削除され、コンパイルエラーでビルド不能な状態になってしまいました。
再インストールすればいいやーと、NuGetでインストールを指示したらなんとエラー。バージョンがダメだと。慌てずにバックアップを戻してコンパイルするとこれもエラー。設定はブロジェクトごとのはずなのに何故?
VS2017を再インストールしてもダメ。数時間格闘して結局
アプリで参照しているSupport.V4ライブラリのインストール時に、どのバージョンを入れるにしてもXamarinのライブラリは最新のandroid(現在だとv8.0のOreo)になっていないとインストールできないようにNuGet用の設定ファイル(template.nuspec)に書いてあるのです。こんな感じで。

<file src="support-v4/nuget/Xamarin.Android.Support.v4.targets" target="build/MonoAndroid80" />



で、これがXamarinの指定とあっていないダメってことですが、リストにOreo8.0がない。ここに出すには、VS2017のツール→Android→Android SDK Manager..でツールを起動し、8.0をインストールしてやる必要があります。


そうすると、やっと8.0が選べます。



この状態でXamarin.Android.Support.Core.Utilsの再インストールができると思いきや、まだ落とし穴が。VS2017が変更を認識してくれない。
仕方がないので一旦VS0217を終了。プロジェクトフォルダ内の以下のフォルダを全て削除して再起動。
.vs
Packages
obj
bin
これでやっと再インストールができるようになりました。複雑過ぎる。ここに書いとかないと絶対また忘れる。
で、KitKat4.4に戻さずにコンパイルすると、
obj\Debug\android\bin\packaged_resourcesが無いというエラーが出ます。
なんでかわからん。
Xamarin.Android.Support.V4を使うために入れているのですが、v25.1.0にしています。このバージョンはandroid70が必要と書いてあるのですが、v4.4でも警告が出るものの使えます。XperiaZL2の実機でも動くので気にしませんけど、そろそろ真面目にAndroidバージョンを意識して開発しないと…。



2017年12月15日金曜日

スマホ用音楽リモコン ELECOM LAT-RC015

主に通勤時に音楽を聞くのに長い間iPodを使用していましたが、スマホが自分専用になり、マイクロSDカードを導入したことを機にスマホを音楽プレイヤーとして使っています。
自分が欲しい機能のみを実装した軽量なプレイヤーアプリを自作して愛用しているのですが、唯一の不満だった演奏制御をリモコンを導入して改善しました。

スマホを音楽プレイヤーにする場合の唯一の欠点は再生一時停止、曲送りなどの演奏制御をするのに、いちいち画面を立ち上げてボタンにタッチしなければいけないところです。

これまではアプリで音量ボタンとカメラボタンを演奏制御に変更して代用していましたが、音量上下とカメラで3つしかないので、ボタンが足りません。
画面OFF時
音量ボタン=音量
画面ON時
音量ボタン=曲送り戻しor早送り巻き戻し
カメラボタン=再生一時停止
などという風にしていたのです。
本体の音量ボタンはAndroid(OS)が制御しているのか、アプリケーションから横取りできなかった…。

改善手段としてリモコン付きのイヤフォン導入の発想はあったのですが、好みのイヤフォンでボタンがいくつもあるリモコンが付いたものなど存在せず諦めていました。

ところが最近、カーナビアプリを手元で操作するリモコンの存在を知り、Bluetoothで音楽リモコンとかあるのでは?と思って探してみたらありました。種類は少ないですが、車のハンドルにつけることを想定したものです。
結構値段が高いのですが、最近ELECOMからお安いのが発売されたので、早速購入。自作アプリを対応させました。


その結果画面OFFの間もリモコンで曲送り戻し、再生一時停止が可能になり、使い勝手が大幅に改善されました。勢いにのって朝会社に行く前に長押しで、早送りと巻き戻しができるようにして喜んだのですが、画面OFF時に早送りと巻き戻しが効かないことが発覚。
すっきりしない気分で出社。早く直したいけど、どう直そう。解決方法は一応思い付いているのですけど。

2017年12月12日火曜日

Xamarin文字化け&VS2015Community起動不能

先日マイクロSDカードを取り替えたら、自作のスマホ音楽プレーヤーアプリが動かなくなったので(ダメじゃん)、久しぶりに開発環境を起動してデバッグしました。
半年以上自分の書いたプログラムを見ないと、まるで他人が書いたプログラムにみたいに忘れてます。
で、新たにBluetoothリモコンでアプリが使えるようにしようかと改良を始めたのですが、以前発生していたデバッグ開始時にハングアップする不具合が何故か再発。

おかしくなったらバージョンアップ!の法則でXamarinを更新。最新のベータ版にしたことが災いしたのか、更新後にXamarinに関するメニューの日本語部分が文字化けしてしまいました。
一応使えてはいたので我慢しておけばよかったのですが、なんか気になってしまい、VS2015の修復インストールをしてしまったのが運の尽き、VS2015が起動しなくなってしまいました。正確に言うと起動はするのですが、ウィンドウが表示された後すぐに終了してしまうのです。エラーも出ない。
devenv /log filename
でログを出してみましたが、特にエラーは起きておらず原因不明。
あ~あ、やめとけば良かったなぁ、と思いつつも気を取り直して回復作業。

修復インストールに失敗したら、再インストールするの法則です。
XamarinとVS2015、一緒に入ったもの達をバンバンとアンインストール。
VisualStudioは2017にバージョンアップしてた。この際なので、最新環境にしちゃいます。
VS2017はXamarinが統合されたようで、インストーラでチェックして変更ボタンを押せば入っちゃいました。簡単。NuGetがないので、個別コンポーネントで追加して終了。
元々の文字化けは直りましたが、デバッグ開始時のハングアップはどうかな?



2017年2月27日月曜日

FragmentActivity.SupportFragmentManagerでハマる

Androidの厄介な仕様の1つが、アクティビティのライフサイクルです。
本体を回転させた時や、戻るボタンを押したりすると、何故かアクティビティのインスタンスが破棄され、再作成が起こります。
例えばアプリ内で途中のページを見ている時に画面を回転すると、起動直後のように最初のページに戻るというイライラする動きになります。元のページが表示された状態にするには、わざわざ復元するコードを書く必要があります。
で、今のアプリは、Android.Support.V4ライブラリのFragmentActivity,ViewPagerを使っているのですが、再作成が発生した後にViewPagerの開いていたページに飛ばすと、中身の表示がおかしくなるバグの原因がわからず苦労しました。
ViewPagerのページは、Xamarinの場合CurrentItemプロパティで参照・設定するのですが、ページに割り付けたフラグメントは、SupportFragmentManager.FragmentsのList順序と一致するものと思っていたのです。ところがアクティビティのOnCreateで、CurrentItemを途中のページ(0以外)にするとList順序が変わってしまうのです。ということで、リストのインデックスを使わずにFragmentのインスタンスにタグをつけて検索するようにしたところ、再作成時に途中のページを表示することができました。あぁ面倒くさい。