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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

5538閲覧

Unity Android端末にてjsonファイルの保存ができない

tabe_unity

総合スコア31

Android

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/06/24 11:43

困っていること

jsonファイルをUnityで作成してビルド、Android端末にコピーして実行した。
そして、端末上にてjsonファイルを保存しようとするとエラーが発生する。

環境

  • Unity 2019.1.1f1
  • Android 5.0.2

詳細

ソース

ボタンをクリック後にこれらが記述されたメソッドが呼び出されます

C#

1 //下記1行のDebug.log()は確認できました。 2 Debug.Log("Clicked!!"); 3 settings.ScreenOrientation = GetActiveToggle(); 4 settings.BeforeScene = "Title"; 5 6 //インスタンスからsettingJsonに反映 7 settingJson = JsonUtility.ToJson(settings); 8 //インスタンスをdynamicSetting.jsonに書き出し 9 File.WriteAllText(Application.persistentDataPath, settingJson); 10 11 //下記1行のDebug.log()は確認できませんでした。 12 Debug.Log(File.ReadAllText(Application.persistentDataPath)); 13 14 Observable.Timer(TimeSpan.FromSeconds(1.0)).Subscribe(_ => 15 { 16 //下記のコルーチンも走っていない模様。 17 StartCoroutine(GoHomeScene()); 18 });

エラー

エラーはAndroid Device Monitor にて確認しました。
補足にあるパスのすべてを試しましたが同様のエラーが出ました。(もちろん出力されるエラーのパスは違いますが。)

D Unity Uploading Crash Report E Unity UnathorizedAccessException: Access to the path '/strage/emulated/0/Android/data/[my ID]/files' is denied.

補足

パスについては,

Application.temporaryCachePath Application.persistentDataPath Resources以下に配置して直接パス指定

です。
なにか不足している情報があれば追加で質問をお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Application.persistentDataPathはAndroidの場合/data/data/<アプリのID>/files/、SDカードなら/mnt/sdcard/Android/data/<アプリのID>/files/のパスを返します。
なのでファイル名まで記述しないとディレクトリそのものを上書きするという意味になり、deniedされるのではないでしょうか。

以下のようにかけば保存されるかと思います。

c#

1File.WriteAllText(Application.persistentDataPath + "/hoge.json", settingJson);

投稿2019/06/24 11:56

編集2019/06/24 13:27
marurunn

総合スコア702

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

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

tabe_unity

2019/06/24 12:11

回答有り難うございます。 おっしゃられたように行ったのですが同様のエラーが出てしまいました。 一応ファイル名の前に/を入れてもやってみたのですが変わりませんでした。 あと、UnityでのWritePermissionはExternalにしてあります。
marurunn

2019/06/24 12:19

ディレクトリが存在するか、File.Exists(System.IO.Path.Combine(Application.persistentDataPath, "ファイルへのパス")がtrueを返すかどうかも確認してみて下さい。 また、マニフェストファイルに外部ストレージへの書き込みと読み取りの両方の許可が行われているかを確認してみて下さい。 下記の記事で同様の現象がみられていますので、ご参考になるかと思います。 https://forum.unity.com/threads/native-gallery-for-android-ios-open-source.519619/page-5 Application.persistentDataPathは複雑ですので、私の方でも少し調べて何か分かれば報告致します。
tabe_unity

2019/06/24 12:23

ありがとうございます。とりあえずやってみます。原因はAndroidの権限周りのようですね。。。
tabe_unity

2019/06/24 12:50

現状の報告として、UnityからExportしたAndroidManifestでは <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> が確認できました。 また、 Debug.Log(File.Exists(System.IO.Path.Combine(Application.persistentDataPath, "/storage/emulated/0/Android/data/[appId]/files"))); の出力結果がfalseでした。 いまから教えていただいた記事ものについてみてみます
marurunn

2019/06/24 13:26

代替案として、こちらを参考にファイルへの出力方法を変更してみて下さい。 https://www.sejuku.net/blog/50432 こちらはStreamWriterで出力しており、Application.dataPath + /savedata.jsonなどでファイルを書き込めることを確認しております。 分かりやすさを重視されているサイトですので理解も比較的簡単かと思います。 いかがでしょうか。
tabe_unity

2019/06/24 13:43

settingJson = JsonUtility.ToJson(settings); writer = new StreamWriter(Application.dataPath + "/setting.json"); writer.Write(settingJson); writer.Flush(); writer.Close(); 教えていただいた記事を参考に以上のソースを書いて実行してみたのですが実機上では下記のようなエラーが発生してしまいました。エディタ上では正常な動作をしました。 06-24 22:39:12.013: E/Unity(2958): DirectoryNotFoundException: Could not find a part of the path "/data/app/[MyAppID]/split_config.armeabi_v7a.apk/setting.json".
marurunn

2019/06/24 13:48

となるとやはりディレクトリが存在しているのかが気になります。 パソコン上からAndroidのディレクトリ構造は確認する事は出来ますか? もしディレクトリが存在しなければディレクトリを作成するコードを書いてみて下さい。 http://baba-s.hatenablog.com/entry/2014/06/09/210016
tabe_unity

2019/06/24 14:10

解決策ありがとうございます。しかし下記のように打ったところまたエラーが発生してしまいました。 DirectoryUtils.SafeCreateDirectory(Application.dataPath + "/SettingJson"); writer = new StreamWriter(Application.dataPath + "/SettingJson" + "/setting.json"); writer.Write(settingJson); writer.Flush(); writer.Close(); 06-24 23:03:37.868: E/Unity(4368): IOException: Cannot create /data/app/[My App ID ]/split_config.armeabi_v7a.apk because a file with the same name already exists. 一応、上記のコードを使う前にもApplication.dataPathのみでディレクトリを作成したのですが同様の結果となってしまいました。もしこの状態でも解決策がありそうでしたら教えていただけると幸いです。もしもう思いつきそうもない状態でしたらjsonを使わない方針でやってみます.... お手数をおかけして大変申し訳ありません。
marurunn

2019/06/24 14:25

同じファイルがもうあるようなのでディレクトリを作成できないようですね。 Androidの端末によってはtabe_unityさんのようにエラーが発生する事があるのですが... 推測ですが、ディレクトリへのアクセス権限がAndroid端末側でロックされているような印象を受けます。 恐らくjsonファイル以外、txtファイルやcsvファイルでも同様の現象が発生するかと思います。 開発者オプションでUSBデバッグモードはONにされているでしょうし... 申し訳ありません、すぐにはこれ以上解決策が思い浮かばないので引き続き情報収集をされる事をお勧め致します。 私も手が空いた時に情報を集めてみますが、解決は難しそうですね..
tabe_unity

2019/06/30 14:04

いろいろ試してみたのですが、アクセス権限も開放されていて原因が特定できませんでした。。。 USBデバックモードもONになっていました。 あまりこのような考え方はしたくないのですが、OSが古いことも原因かもと思うまでになりました。 現在、Jsonでの実装を諦めてクラスを用いた管理に変更しました。 問題にお付き合いいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問