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

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

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

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

4942閲覧

androidの内部ストレージへの書込み

TAKE_SS

総合スコア40

Android

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2020/07/31 05:50

実現したいこと

Androidの内部ストレージに任意のフォルダ(DATA など)を作成し、そこにファイルの読み書きを行おうとしています
詠み込み(System.IO.File.ReadAllLines)はできるのですが、書き込み(System.IO.File.WriteAllText)では、エラー(UnauthorizedAccessException)になって書き込みが出来ません。

書込可能にする方法はないでしょうか

実施したこと

・Android端末をPCに接続して手動で内部ストレージに
「DATA」フォルダを作成 : OK
・ファイルを作成したフォルダにコピー : OK
・xamarinのアプリから、ReadAllLines : OK
・xamarinのアプリから、WriteAllText : NG

・READ_EXTERNAL_STRAGEとWRITE_EXTERNAL_STRAGEは設定済み

C#

1<xamarin> 2 3string strbase = Android.OS.Environment.ExternalStorageDirectory + "/DATA/"; 4string path = Path.Combine(strbase, "TESTFILE1.TXT"); 5string path2 = Path.Combine(strbase, "TESTFILE2.TXT"); 6//string path3 = Path.Combine(strbase, "TESTFILE3.TXT"); 7 8try 9{ 10 var Lines = System.IO.File.ReadAllLines(path, Encoding.GetEncoding("shift-jis")); 11 System.IO.File.WriteAllText(path2, "TEST"); 12 // System.IO.File.Create(path3); 13} 14catch(Exception ee) 15{ 16 string msg = ee.Message; 17} 18

【環境】
Windows10 VisualStudio2019 xamarin
Target : Android7.0

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

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

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

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

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

takapi_cs

2020/07/31 06:16

文面では「内部ストレージ」と記載していますが、Android.OS.Environment.ExternalStorageDirectoryを見る限り「外部ストレージ」を指定しているように見えます。 どちらへファイル操作を行いたいか改めて教えてもらえますか?
TAKE_SS

2020/07/31 06:26 編集

AndroidをPCに接続したときに、「内部ストレージ」を表示された場所にフォルダを作ったので内部ストレージかと思っていました。 (DCIMやMusic等がある場所に「DATA」フォルダを作っています。 このフォルダへのファイル操作になります。 ちなみに、実際にAndroid.OS.Environment.ExternalStorageDirectoryで期待するフォルダのファイルにアクセス(Read)は出来ています。
TAKE_SS

2020/07/31 06:40

情報ありがとうございます。 実行時に「Android.OS.Environment.ExternalStorageState」の値を確認してみたところ、「mounted」となっていました。 何か基本的なことを知らないだけなんだろうとは思っているのですが、 普通に読み書きできそうな気もするのですけど。。。
takapi_cs

2020/07/31 06:45

Storageに関するPermissionCheckの処理は追加していますか?
TAKE_SS

2020/07/31 06:52

READ_EXTERNAL_STRAGEとWRITE_EXTERNAL_STRAGEは設定していますが、そのことではないのでしょうか 無知ですいません。
TAKE_SS

2020/07/31 07:38

勉強不足ですいません CheckSelfPermissionで「WriteExternalStorage」を確認してみたところ、deniedになっていました。 これをGrantedになるようにすれば良いのですね。 試してみます
takapi_cs

2020/07/31 07:54

ヒントになったなら良かったです。 正しく動いたら、この質問は自己解決として内容をまとめて、クローズしてください。
guest

回答1

0

自己解決

以下の実装で、とりあえず「UnauthorizedAccessException」は回避
但し、まだ期待する書き込みは出来ていませんが。
(正常応答だが書き込みできていない)
まあ、本件とは別要因でしょうからクローズします

c#

1var permissioncheckW = ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage); 2if (permissioncheckW == Android.Content.PM.Permission.Denied) 3{ 4 ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 0); 5} 6 7public OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) 8{ 9 base.OnRequestPermissionsResult(requestCode, permissions, grantResults); 10} 11コード

投稿2020/08/03 00:00

TAKE_SS

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問