TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

【Android開発】実行時のパーミッションリクエスト

先日バージョンアップしたボーカル音程モニターで、起動できないというレビュー(評価★1)が多く付いたので、一旦リバートしました。
段階的な公開で10%にしていたので影響は抑えられましたが、テスト不足と反省しています。

手元のテスト機では動作しており、動いているレビューもあったので、特定の機種で発生する事象のようです。
レビューの機種を確認すると、Samsungの機種で発生が多いようでした。
再現させないと原因を調べるのも難しいので、海外の個人輸入サイトから安い端末を買いました。

無事海外から届いて再現させたところ、再現できました。
AudioRecordの作成時に以下のエラーが発生していました。

E/IAudioFlinger: createRecord returned error -22
E/AudioRecord: AudioFlinger could not create record track, status: -22
E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.

はじめオーディオ関連のバグを疑って調べていましたが、Android6.0(APIレベル23)以上で必須となった実行時パーミッション確認を行っていないことが原因でした。

バージョンアップ前はターゲットAPIレベル22のため問題は起きなかったですが、Google Playの要件により最低のAPIレベルが26となったため、ターゲットAPIレベルを上げたことで発生するようになっていました。
すでにインストール済みでバージョンアップした場合は録音用のRECORD_AUDIOパーミッションが付与された状態になっていますが、新規インストールした場合はアプリが明示的にパーミッション確認を行わないと、アプリが黙って終了してしまいます。

手元のテスト機にもAndroid6以上の端末がありましたが、前の端末から移行を行ったので、アプリにパーミッションが付与された状態となっており発見できませんでした。
(ということは、端末買う必要なかったorz)
Samsungの機種が多かったのは単に母数が多かっただけのようです。

実行時パーミッションについて

Android6.0(APIレベル26)以上でセキュリティのために導入された仕組みです。
以前はOSが自動的に権限確認を行っていましたが、アプリ側で権限の確認が必要になりました。
以下のページに説明があります。
Request App Permissions  |  Android Developers

このページの通り実装することで権限確認ダイアログを表示できました。
これで解決したはずです。

海外仕様端末

買ったのは海外仕様の端末だったので、音楽記号の「♯」がなぜか灰色で表示されるという問題を発見しました。
以前にイギリスの方からメールで、♯の色が薄くて見えづらいとコメントをもらっていて何を言っているのかわからなかったのですが、理解できました。
「♯」は「#」とは別の記号なので、英語圏の端末ではマルチバイト文字のため別のフォントで表示されていたようです。
対処として、Notoフォントをバンドルすることも考えましたが1文字のためにフォントをバンドルしたくなかったため、「♯」を線で描画するようにしました。

今回のことで海外仕様の端末でのテストも必要だということがわかりました。
(端末買ったのは無駄ではなかった!)


もう少しテストしてからまた段階リリースすることにします。
最近知ったのですが、段階リリースのことを「カナリアリリース」と言うそうです。