こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Android ファイルの書き込み

【前提・実現したいこと】
SDカード(外部ストレージ)のフォルダ内にあるファイルに書き込みを行いたいのです。

【発生している問題・エラーメッセージ】
ファイルに書き込みを行う処理で catch (FileNotFoundException e)でエラーを拾われて、書き込みができません。

言語:Java
try {
File fStatusFile = new File(sLicenseStatusFile);
fOutStream = new FileOutputStream(fStatusFile, false);
fOutStream.write(sLicenseStatus.getBytes());

} catch (FileNotFoundException e) {
ShowMsgDialog("書き込みができません" + sLicenseStatusFile);

return false;
}

【試したこと】
Android6.0以降からpermissionがAndroidManifestだけではだめなものがあると
知ったので実際に、プログラムコードの中でストレージの読み書き権限の確認と
許可を得る作業を実装しました。

また、端末の「設定」→「アプリ」から該当するアプリを選択して権限を確認しました。
結果は、
「SDカードのコンテンツの変更または削除」
「SDカードコンテンツの読み取り」
が許可されていました。

【Runtime Permission部分】
書き込みの処理の前に呼び出しています。

言語:Java
private static final int REQUEST_EXTERNAL_STORAGE_CODE = 0x01;
private static String[] mPermissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
};

private static void verifyStoragePermissions(Activity activity) {
int readPermission = ContextCompat.checkSelfPermission(activity, mPermissions[0]);
int writePermission = ContextCompat.checkSelfPermission(activity, mPermissions[1]);

if (writePermission != PackageManager.PERMISSION_GRANTED ||
readPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
mPermissions,
REQUEST_EXTERNAL_STORAGE_CODE
);
}
}

【補足情報】
Android Studio2.3.3
SDKのAPIは25
OSのAndroidバージョンは7.1 です。

過去の同じような事例を参考に試してみましたが上手くいきません。
ファイルを書き込むためのルートパスも間違っていない上に、
権限が許可となっているのに書き込みができないとはどういうことでしょうか?
よろしくお願いいたしま す。

投稿日時 - 2017-10-26 16:49:28

QNo.9390195

すぐに回答ほしいです

質問者が選んだベストアンサー

>「SDカードのコンテンツの変更または削除」
>「SDカードコンテンツの読み取り」
>が許可されていました。

(Android6.0以降のpermissionは良く知りませんが)その状態からするとpermissionは正常のように思われます。

>ファイルを書き込むためのルートパスも間違っていない

もしかしてルート権限でプロテクトされている所にファイルを出力しようとしてませんか?

import android.os.Environment;

String SDCardRoot = Environment.getExternalStorageDirectory( ).getPath( );

↑本当のRootではありません、アプリから読み書きできるRoot(Rootと言うのは不適切かもしれませんが…)、SDCardRootより下位でないとアプリから読み書きできません。
通常は内部ストレージが対象になりますが、確かAndroid5のみ外部ストレージが対象だったか?、詳しくはググって下さい。
当方の場合はSDCardRoot=「/mnt/sdcard」などとなっています。

投稿日時 - 2017-10-26 23:31:05

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>回答No.1 amanojaku1 レベル12

>import android.os.Environment;
>~
>String SDCardRoot = Environment.getExternalStorageDirectory( ).getPath( );

「SDCardRoot」は あくまで一例です、自分の分かりやすい変数名を付けて下さい。

投稿日時 - 2017-10-27 00:34:53

あなたにオススメの質問