【Android】6.0からのパーミッション

今日のエラー

ファイルをローカル保存しようとした時、
SecurityException: Permission denied (missing INTERNET permission?)
が投げられた。

原因

Androidは6.0からパーミッションの取り扱いが変わったため。

6.0以前

パーミッションのユーザ承認は、GooglePlayから入手する時に明示されるだけだった。

6.0以降

危険なパーミッションに限り、コード上でユーザ承認がなされていなければパーミッションエラーとなる。

解決

ユーザにパーミッション承認を得て、危険な機能の使用時に承認済みであることをチェックすることが必要。
今回のようにファイルのローカル保存なら、各処理の前にWRITE_EXTERNAL_STORAGEのパーミッション承認をかませると良い。
なお、今までのようにAndroidManifest.xmlにパーミッションの記述が引き続き必要。

ユーザにパーミッション承認を得る
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions(
    activity,
    permissions,
    0);
危険な機能のパーミッションが承認済みであることをチェックする
if (ContextCompat.checkSelfPermission(
    activity,
    android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
  != PackageManager.PERMISSION_GRANTED) {
}

リファレンス

概要
危険な機能とパーミッション一覧