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の状態でビルドし、マシュマロ端末側からアクセス権限を許可していないためだった。
設定→アプリ→お目当てのアプリ→許可へすすみ、タップして許可onするとログ出力もファイルアクセスもできた。
なるほど、Marshmallowから個別に権限許可が必要なのか
この仕様変更は大きいな...
個別許可が面倒な場合
build.gradleのtargetSdkVersionを22にすりゃOK
targetSdkVersion 22
これで許可うんぬんの確認が不要で、外部ストレージにアクセス可能になった