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

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

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

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

Android

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

Q&A

解決済

2回答

1071閲覧

[Android]アプリ固有の内部ストレージにファイルを保存する方法について、Androidデベロッパガイドに対する質問(その2)

guijiu

総合スコア36

Java

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

Android

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

0グッド

1クリップ

投稿2021/09/20 23:19

#前書き
Androidデベロッパガイドを読みながら、アプリ固有の内部ストレージにファイルを保存する方法について、勉強しています。

ストリームを使用してファイルを保存する」の項目読んでいて、以下の注意書きありました。

注意: Android 7.0(API レベル 24)以上を実行するデバイスでは、openFileOutput() に Context.MODE_PRIVATE ファイルモードを渡さないと、SecurityException が発生します。

#質問
実際に、以下のソースコードでContext.MODE_PRIVATEをContext.MODE_APPENDに替えて、Android7.0以上のエミュレータで実験したのですが、Logcatには、SecurityExceptionの例外は発生していませんでした。
SecurityExceptionの例外を発生させたいのですが、私の作業や解釈のどこに誤りがあったのでしょうか?
ご教示のほどよろしくお願いします。
イメージ説明

#ソースコード

このソースコードは、次のとおりです。(今回はレイアウトを表示しないようにしましたので、activity_main.xmlファイルはありません。)

java

1 2public class MainActivity extends AppCompatActivity { 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 8 String str = "abcdefghijklmn"; 9 // try-with-resources 10 Context context = getApplicationContext(); 11 12 try ( 13 // FileOutputStream fileOutputStream = context.openFileOutput("test.txt", Context.MODE_PRIVATE) 14 FileOutputStream fileOutputStream = context.openFileOutput("test.txt", Context.MODE_APPEND) //モードを変更してSecurityExceptionを発生させたい 15 ){ 16 fileOutputStream.write(str.getBytes()); 17 } catch (IOException e) { 18 e.printStackTrace(); 19 } 20 } 21}

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

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

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

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

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

guest

回答2

0

ベストアンサー

当方で試せていないので推測ですが、MODE_PRIVATEは既定の値0のファイル作成モードで、MODE_APPEND を指定した場合はMODE_PRIVATEの「プライベート領域にファイルを作成する」前提に加えて「ファイルが既に存在すれば追加する」という指定を意味するのだと思われます。恐らくMODE_WORLD_WRITEABLEなど他のアプリケーションもアクセス可能なかんじのファイルの作成の仕方をすると、SecurityExceptionがスローされるのではないでしょうか。

またコードに関してですが、勉強、確認の為にはExceptionの類はいったん全部捕捉して出力するなりAndroidStudioのデバッガーでブレイクさせるなりして確認すれば確実です。

Java

1try { 2 // Exceptionの類がthrowされるであろう何らかの操作 3 ; 4} catch (IOExcpetion e) { 5 e.printStackTrace(); 6} catch (SecurityException e) { 7 // 確認の為ならこれも捕捉 8 e.printStackTrace(); 9 throw e; // お好きに再throw 10} catch (Exception e) { 11 // いっそ全部捕捉するなど。 12 e.printStackTrace(); 13 throw e; // お好きに再throw 14}

投稿2021/09/21 01:31

dodox86

総合スコア9256

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

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

guijiu

2021/09/21 06:41

丁寧なご回答を頂き、ありがとうございました。お陰様で、疑問が解決しました。 私の誤解していた点は、次の2点だと思います。 (1)openFileOutput()メソッドで指定モードMODE_APPENDが、SecurityExceptionを生じないモードであった。 (2)SecurityException例外を補足するための、catch()文が正しくなかった。 (1)については、補助的に参考にしていたサイトの記事で指定できるモードがMODE_PRIVATEとMODE_APPENDの2つしか記述がなく、またデベロッパガイドもMODE_PRIVATE以外なら例外が生じると書かれていたため、安易にAPPENDで実験してしまいました。APIレファレンスも見直さないといけないですね。 (2)については、Exceptionの使い方を理解していないためでした。 以上、反省を兼ねて、お礼申し上げます。
dodox86

2021/09/21 07:19

Androidと言うOS/実行環境に限りませんが、多くのOSでファイルを開く際に様々なモードを指定する必要があります。 ・新規で開く。既に存在すれば末尾に追記する(MODE_APPENDがこれに相当) ・常に新規で開く。既に存在すれば内容を削除して開く。 ・ファイルが存在すれば開く。存在しなければ失敗する。 など。Androidの開発者ガイドに限りませんが、説明が足りないことは常に考えられるので、Android以外の他の環境と照らして自分で想像して補足する必要はあるかもですね。
guijiu

2021/09/22 10:34

実のところ、当方、幾つか作りたいものがあり、それに合わせてC#を勉強したり、Kotlinを勉強したり、色々な言語を食い散らしています。そのせいでしょうか、一向にレベルが上がらないのと、また歳のせいか、やったこと右から左に忘れていく次第、、、お恥ずかしい限りです。ソフトウエアエンジニアの共通言語ともいうべきJavaを広く、しっかりと勉強しなければなりませんね。 ありがとうございました。
guest

0

dodox86さんのご教示により、以下のとおり、SecurityExcepiton例外を補足できました。
イメージ説明

投稿2021/09/21 06:49

guijiu

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問