#この手順には問題がありました。(2018/11/1追記)
targetSdkVersionを23にした後に、22に戻しても既にインストールしているアプリには上書きできない仕様になっていました。Google Playでのアップロードは試していないですが、同様の縛りがある可能性があります。
- アンインストールしてから、インストールする
することで、一応使えるようにできます。それ以外では結局以下の対応が必要です。
- 設定 -> アプリ -> 当該のアプリと進んで権限を設定する
- 権限設定のフローをアプリ内に用意する(一番真っ当な対応)
#経緯
Android 6.0よりUser-Permissionの仕様が変わったことはググると相当出てきます。結構なポリシー変更だしトピックとしては熱いので、Qiitaにも結構記事がありますね。
変更点は、
- Permissionの確認タイミングが「インストール時」から**「機能を使うタイミング」**に変わった
- 自動的にONにはしてくれない。ユーザー承認が必須
といったところです。だいたいこの変更点に対するGoogleの意向に沿った対処について記述されています。当然重要なポイントなので、そういう書き方が真っ当な方向性です。ただ、
- 自動でONにはしてくれないので、OFF状態でアプリが駆動してしまい、不具合が発生する
しまうことになり、かつ想定ユーザーを信頼できない場合や極力手数を減らしたい場合
- 真面目に実装すると必須の確認ダイアログを、表示させたくない
等、その仕様じゃ困るという場合に、どうしたらAndroid 6.0以上の端末でインストール時の確認でOnに出来るかについて言及されているものがありませんでした。ちょっと考えたら対処は出来たんですが、そのちょっとに少し時間が掛かったので、メモ代わりに記事にすることにします。
**あんまり良い考え方、対処じゃないのは自覚しています。**時間と予算が許すならきちんと最新のポリシーに沿って実装することをお勧めします。
また対処方法をご覧いただくと分かると思いますが、sdkのバージョンが高く設定する必要があるなら、この方法は利用できません。
#対処方法
簡単です。この問題にぶち当たる時は、Buildの設定で真面目にtargetSdkVersionを最新に近い値を設定しているときです。このtargetSdkVersionを22にするだけでインストール時の確認に戻ります。
分かっている人からすると、当然と思うところかと思います。
targetSdkVersionを23以上にしていると、user-permissionの仕様変更が適用されます。インストール時に確認する方式にしたい場合、targetSdkVersionを確認して、23以上になっていれば、22にすることでインストール時の確認に戻すことができます。
結論の簡単さと比べ、思いつくまでの時間が長かった...
コロンブスの卵的な少し酸っぱい後味でした...
#よくありそうなケース
アプリ自体は、頻繁に更新されているが、アプリを利用している端末の更新が遅い場合。法人でタブレットを専用端末として開発した場合、そうそう端末を頻繁に変えないので、この問題は潜在的に長く潜伏しやすい性質があります。私の場合はこれです。
こういう場合、ユーザーの操作を極力減らしたい、分かりづらい権限の設定等はユーザーに触らせたくないという要件はあり得るかと思います。
#問題発生の兆候と迷走への序曲
私の場合、SD Card等の外部ストレージへのアクセス権限が無くなっていたのが問題表出の最初でした。logcatにPermission deniedと表示されている状態でした。この場合、AndroidManifestの記述を疑いますが、当然このケースではきちんと「android.permission.WRITE_EXTERNAL_STORAGE」が記述されていることになります。
それにより迷走の糸口になりやすい、というよりなりました。私はManifestの記述の仕方を変えれば何とかなるんじゃないかという方向で一生懸命ググってました。