質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

1370閲覧

Android / 外部ストレージ / 書き込み

xxx8

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

3クリップ

投稿2017/10/26 07:30

編集2017/10/26 12:12

###前提・実現したいこと

SDカード(外部ストレージ)のフォルダ内にあるファイルに書き込みを行いたいのです。

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

java

1 2try { 3 4String sLicenseStatusFile = /storage/SDカード名/自作フォルダ/test.txt 5 6 File fStatusFile = new File(sLicenseStatusFile); 7 fOutStream = new FileOutputStream(fStatusFile, false); 8 fOutStream.write(sLicenseStatus.getBytes()); 9 10} catch (FileNotFoundException e) { 11 ShowMsgDialog("書き込みができません" + sLicenseStatusFile); 12 13return false; 14}

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

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

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

java

1private static final int REQUEST_EXTERNAL_STORAGE_CODE = 0x01; 2 private static String[] mPermissions = { 3 Manifest.permission.READ_EXTERNAL_STORAGE, 4 Manifest.permission.WRITE_EXTERNAL_STORAGE, 5 }; 6 7 private static void verifyStoragePermissions(Activity activity) { 8 int readPermission = ContextCompat.checkSelfPermission(activity, mPermissions[0]); 9 int writePermission = ContextCompat.checkSelfPermission(activity, mPermissions[1]); 10 11 if (writePermission != PackageManager.PERMISSION_GRANTED || 12 readPermission != PackageManager.PERMISSION_GRANTED) { 13 ActivityCompat.requestPermissions( 14 activity, 15 mPermissions, 16 REQUEST_EXTERNAL_STORAGE_CODE 17 ); 18 } 19 }

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

過去の同じような事例を参考に試してみましたが上手くいきません。

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

###追記
マルチポストのルールを知りませんでした。
急いでいたので複数質問してしまいました。
以後気をつけます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2017/10/26 08:15 編集

sLicenseStatusFileの値を追記してください。
xxx8

2017/10/26 12:14

sLicenseStatusFileの値を追記しました。SDカードのAndroid/data/パッケージ以下ではないです。
guest

回答2

0

ベストアンサー

"android DocumentFile"といったキーワードで検索すると、それらしい情報がいろいろ出てきますね。

[Android][Lollipop]Android5.0で可能になったSDカードへの書き込みを試す
Lollipop 以降の端末で SD カードにファイルをコピーするサンプル
Android Lollipop での SDカードへ書き込み

あたりとか。自分でもやってみて、確かに書き込めるみたいなのだけど、まだしっかり把握していないので、情報提供のみに止めます。

投稿2017/10/28 10:27

keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sLicenseStatusFileがないのでは?

fStatusFile.createNewFile();

でファイルを作成してから書き込みしないと

ちゃんと作るならファイルの存在チェックをして
あったら消してから作るなどしないといけませんが。

投稿2017/10/27 01:13

Yossi_1982

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2017/10/27 05:48 編集

私も最初は単なる処理ミスでは?と思いました。内部ストレージ(/storage/emulated/0/の下)であれば、Runtime Premissionによって許可を得れば書き込みもできます。ところが、実際に試してみると外部ストレージの直下(/storage/<uuid>/の下)は許可を得ても確かに書き込みができません(shellなどを使って予め作っておいたファイルの読み込みはできる)。createNewFileを行っても、IOExceptionが飛びます。もしかしたら機種にもよるのかもしれませんが、少なくともAVDではできません。私も恥ずかしいことにこの辺をきちんと理解できていなかったので、現在調査中です。 なお、外部ストレージであっても、Context#getExternalFilesDirsで得たディレクトリー(/storage/<uuid>/Android/data/<パッケージ名>/)の下であれば、Runtime Permissionで許可を得なくても読み書き可能ですが、質問者様の補足から見てこれは要件外なのでしょう。
xxx8

2017/10/27 07:22

いろいろ試してみましたが結果としてだめでした。 仕様を改めてからまた作業に入りたいと思います。 皆様ありがとうございました。
Yossi_1982

2017/10/30 00:47

違いましたか。。。 お力になれずすいません。 (この辺は、Androidのバージョン毎とか端末毎に結構違いが出る箇所でめんどくさいですよね。。。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問