スポンサーリンク

2016年1月27日水曜日

Android6.0(マシュマロ)でSDカードが使えなくなった


Google Play で公開しているアプリをどきどきメンテナンス・リリースを行なっています。基本的にはSDKやライブラリをアップデートし、targetSdkVersion も最新バージョンを指すようにしたりしています。リリース前には当然テストを行ないますが.....あれっ?Android6.0 でアプリが動きません。


原因はすぐに分りました。SDカード(外部ストレージ)にアクセスできないのです。Android5.X以前のデバイスであれば何の問題もなく動作するのに。

不勉強なもんで今回初めて知ったのですが、Android6.0 で新しいパーミッションモデルが導入されました。今までは AndroidManifest.xml にパーミッションを記述しておけば、後はインストール時に、パーミッションを与えて良いかどうかのユーザへの問合せを、GooglePlayアプリが勝手にやってくれました。

しかしAndroid6.0では、このユーザへの問い合わせを(インストール時ではなく)実行時にアプリが自分で行なわなくてはならなくなったのです。つまり問い合わせ処理を、アプリ開発者が自分で実装しなくてはならないのです。

正確に言うと、まず数あるパーミッションが大きく Normal と Dangerous の二つにカテゴリー分けされました。Dangerous はプライバシー情報にアクセスする可能性のあるパーミッションで、Normal はそうでないものです。この Dangerous の方に属するパーミッションを使う場合は、アプリケーションが明示的にユーザ問い合わせを行ってパーミッションを得なくてはならなくなったということです。

実装といってもライブラリを呼び出すだけなので難しいことは何もありません。このあたりを参照すればすぐに組込むことができます。


しかし面倒くさいのはパーミッションが得られるまで処理を先に進められないことです。また一点注意したいのは、この新しいパーミッション・モデルが適用されるのは以下の二つの条件が成り立ったときということです。

  • Android 6.0 以上のデバイスで実行している
  • targetSdkVersion が 23 以上になっている

なので、targetSdkVersion を 22 以下にしておけば、例え Android 6.0 デバイスで実行しても従来のパーミッション・モデルが適用されます。暫くの間は、無闇に targetSdkVersion をアップデートして驚かないよう気を付けましょう。

どうも世の中には闇雲に targetSdkVersion をアップデートしてしまい、Android 6.0になったとたんSDカードやらその他が使えなくなっているアプリがあるようです。そして開発者がそれに気づいてすらいない。そうなるとユーザ側でできることはほとんどありません。デバイスを5.X以前に戻すことくらいしか。あとは開発者に通知して早く直してくれるようお願いしましょう。






0 件のコメント :

コメントを投稿