2014-01-30 [長年日記]
KitkatではSDカードへの書き込みができなくなる?
結論から先に書いておくと、そんなことはない。追記したので下の方から読んでください。
発端はKitKat端末では今後アプリからMicro SDカードへの書き込みができくなる模様。そして、記事のもととなった記述資料は External Storage Technical Information。
Multiple external storage devicesの項を読むと、確かにWRITE_EXTERNAL_STORAGE permissionではprimary external storageに対してのみwrite accessを与えるべきだと書いてある。
では、このprimary external storageは何かというと、例えばバッテリーの場所にあるスロットのSDカード、と書いてあるように、内蔵ストレージのみではないことが明確に書かれている。また、primary external storageが複数ある(内蔵ストレージ+SDカードなど)構成があり得ることは、
Context.getExternalFilesDirs()
と、API名が複数形であることからも明らか。ちなみにprimary external storageでないもの(secondary external storage)は何かというと、USBメモリなどの一時的なストレージで、WRITE_EXTERNAL_STORAGE permissionで書き込めない理由は、アプリのアンインストール時にデータのクリーンナップが確実にできる保証がないためとのこと。USBメモリに書き込む方法はないわけではないと思うけど興味の範囲外なのでパス。
元の記事とはあまり関係ないけど重要なポイントとして、/(mount point)/Android/data/(package-name)は権限なしで読み書き自由で、ほかのディレクトリにアクセスするには今までどおり、WRITE_EXTERNAL_STORAGEもしくはREAD_EXTERNAL_STORAGEの権限が必要。ただし、権限をつければ読み書きできるのでセンシティブな情報はいままでどおりInternal Storageに保存してねとのこと。
これにより、ゲームの外部データやキャッシュなど自分自身のデータにアクセスするだけのアプリは(WRITE|READ)_EXTERNAL_STORAGEの権限を付ける必要がなくなり、逆に必要もないのにストレージの読み書きを要求するアプリはあやしいと判断することができる。ということでアホほど権限をつけるアプリ各位は対応のほどよろしくお願いします。
(追記)話の筋は変わらないけど、大きく間違っている場所があったので修正しました。ごめんなさい。以下が修正前の文章。
このディレクトリ(/(mount point)/Android/data/(package-name))に関してはFUSEで保護されていて他のアプリから読み書きできないので、センシティブな情報やログはここに書き込めばOKらしい
追記の追記
いろいろ間違えてたのでいったん全部忘れて!
前提条件
androidでは外部ストレージについていろいろなバリエーションがある。
- 内蔵ストレージのみ(Nexus7など)
- SDカードのみ
- 内蔵+SDカード
いまどきは内蔵ストレージのないデバイスはほとんどないので、必然的にSDカードがつくとそれがセカンダリになる。
KitKatではこうなるよ
- primary external storageに関してはAndroid/data/(package-name)は権限なしで読み書き自由
- それ以外も(READ|WRITE)_EXTERNAL_STORAGEをつければ読み書きできるよ
- secondery external storageに関してはAndroid/data/(package-name)は権限なしで読み書き自由
それ以外はダメそれ以外は書き込み禁止。読み込みには多分READ_EXTERNAL_STORAGEが必要- 音楽や動画、静止画の再生はContentResolver経由なので大丈夫
ということで、APIリファレンスや諸々をちゃんと読んだ感じでは、元記事の内容は煽りすぎですが、汎用のストレージとしては使用できなくなるのは確かなようです。 簡単ですが取り急ぎ。
初めてコメントさせて頂きます。<br><br>>secondery external storageに関してはAndroid/data/(package-name)は権限なしで読み書き自由<br>>それ以外はダメ<br><br> 重箱の隅ですが、Android/data/(package-name)以外の"読み込み"は、READ_EXTERNAL_STORAGEを付与しても不可能なんでしょうか。<br> "External Storage Technical Information"には、<br><br>Apps must not be allowed to "write"<br><br> とあって、制約は書き込みのみであるように読み取れましたので。<br>(どこかに明記されていて、私が読み落としているようでしたら申し訳ありません)<br><br> 個人的には、読み込みができれば利便性はさほど落ちないのでは? という気もしています。
あ、その通りですね。<br>Developers Reference( Context.html#getExternalCacheDirs() )にも、<br>Write access outside of these paths on secondary external storage devices is not available.<br>とあるので、Write accessのみ禁止のようです。
ということでちょっとだけ書き直しました。<br>実際のところはコードを読んでというところですが、<br>全体を通してみると納得のできる変更のように思います。