Android Mの外部ファイルへのパーミッション変更を今更確認

開発中に実体験で学んできた。

外部SDにログを出力しようとしたところ、Android6.0のMarshmallow端末のみエラーとなった。

/storage/emulated/0/20160215_171358.log: open failed: EACCES (Permission denied)
 java.io.FileNotFoundException: /storage/emulated/0/20160215_171358.log: open failed: EACCES (Permission denied)
     at libcore.io.IoBridge.open(IoBridge.java:452)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
     at java.io.FileWriter.<init>(FileWriter.java:96)
     ...

原因はbuild.gradleのtargetSdkVersion 23の状態でビルドし、マシュマロ端末側からアクセス権限を許可していないためだった。

f:id:banbara:20160215182726j:plain

設定→アプリ→お目当てのアプリ→許可へすすみ、タップして許可onするとログ出力もファイルアクセスもできた。

なるほど、Marshmallowから個別に権限許可が必要なのか
この仕様変更は大きいな...

個別許可が面倒な場合

build.gradleのtargetSdkVersionを22にすりゃOK

targetSdkVersion 22

これで許可うんぬんの確認が不要で、外部ストレージにアクセス可能になった