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

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

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

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Android

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

Unity

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

Q&A

解決済

2回答

4473閲覧

StreamingAssetsのパスの先頭にスラッシュが付いてしまう

momo_74

総合スコア0

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Android

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

Unity

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

0グッド

0クリップ

投稿2020/06/01 10:40

編集2020/06/01 14:55

StreamingAssetsのパスの先頭にスラッシュが付いてしまう

Unity2018を使用しandroidでgoogle calendar apiを使用したいと考えており、credentials.jsonファイルを読み込もうとした時に発生しました。

該当のソースコード

FileStreamを使用し、credentials.jsonファイルを読み込もうとし、以下のコードを使用しました。

string pass = System.IO.Path.Combine (Application.streamingAssetsPath, "credentials.json"); using ( var stream = new FileStream(pass, FileMode.Open, FileAccess.Read)) 以下省略

発生している問題・エラーメッセージ

androidにて実行するとファイルパスの先頭にスラッシュが付いてしまいます。
※android実機でもエラーログが見えるコードを使用しています。

C#

1DirectoryNotFoundException: Could not find a part of the path"/jar:file:/data/app/com/プロジェクト名/base.apk!/assets/credentials.json".

補足情報(FW/ツールのバージョンなど)

上記のログが見えるコードを使用し、android実機のデバックログにてpassの内容を確認すると、

"jar:file:/data/app/com/プロジェクト名/base.apk!/assets/credentials.json" 

となり、ファイルパスは正しく取得できているように見えるので、なぜFileStreamに使用すると先頭に/が付いてしまったのかがわからないです。

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

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

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

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

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

hoshi-takanori

2020/06/02 16:57

Unity は知りませんが、Android のリソースや asset は独立したファイルではなかったりするので、ファイルパスが取得できるとは限りません。でも stream としては開けるので、GoogleClientSecrets.Load の引数に stream を渡せば良いのでは。
momo_74

2020/06/03 10:35

GoogleClientSecrets.Load(new FileStream(uri, FileMode.Open, FileAccess.Read)).Secrets, にする、という認識でよろしいでしょうか? 上のコードで実行したところ、 Could not find a part of the path"/jar:file:/data/app/com/プロジェクト名/base.apk!/assets/credentials.json". と出てしまいました。
hoshi-takanori

2020/06/03 10:43

Unity は知らないんですが、FileStream はファイルを開く API ですよね。Java の Android API にはファイルを開く API とは別に、asset を開くものがあるので、Unity にもそういうのがあるんじゃないかと思ったのですが、違ったらごめんなさい。
guest

回答2

0

自己解決

https://docs.unity3d.com/ja/2018.4/Manual/StreamingAssets.html

アンドロイドでは、ファイルは圧縮された .jar ファイル (基本的には標準的な ZIP 圧縮形式と同じ) に格納されます。ファイルの取得に Unity の WWW クラスを使用しない場合は、.jar アーカイブからファイルを取り出すために、追加のソフトウェアが必要です。

との事なのでスラッシュが付いた理由はわかりませんが、取得する事が難しいようです。

投稿2020/06/04 17:16

momo_74

総合スコア0

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

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

0

パスの先頭にスラッシュ云々はわかりませんが、StreamingAssetsの読み込みであればちょっとめんどくさいけど、UnityWebRequestを使うのが結局楽かなぁ、と思います。

Assets/StreamingAssets/hoge.txt」が、以下の内容だとして、

hoge.

以下のように読み込みます。

cs

1using UnityEngine; 2using System.Collections; 3using UnityEngine.Networking; 4using System.IO; 5 6public class Test01 : MonoBehaviour 7{ 8 string message; 9 10 IEnumerator Start() 11 { 12#if UNITY_EDITOR 13 string uri = "file://" + Application.streamingAssetsPath + "/hoge.txt"; 14#else 15 string uri = Application.streamingAssetsPath + "/hoge.txt"; 16#endif 17 Debug.LogFormat("uri = {0}.", uri); 18 UnityWebRequest req = new UnityWebRequest(uri); 19 req.downloadHandler = new DownloadHandlerBuffer(); 20 yield return req.SendWebRequest(); 21 22 this.message = req.downloadHandler.text; 23 } 24 25 void OnGUI() 26 { 27 GUILayout.Label(this.message, GUI.skin.box); 28 } 29} 30

結果、androidで動かすと、

スクリーンショット

と出ているので、問題なしかと。
ただ、UnityWebRequestにはURLで渡さないといけないので、(先のサンプルのように)Application.streamingAssetsPathにURLスキームがない環境は「file://」を付けてやらないといけないようです。


GoogleCalendarAPIは自分も知りませんが、見たところファイル名というよりかは、GoogleClientSecrets.Loadに渡すStreamのようなので、(どうせFileだろうがMemoryだろうが関係ないだろうから)FileStreamの代わりにMemoryStreamを渡してやれば案外うまく行くんじゃないですか。

cs

1 UnityWebRequest req = new UnityWebRequest(uri); 2 req.downloadHandler = new DownloadHandlerBuffer(); 3 yield return req.SendWebRequest(); 4 5 6 // using (var stream = new FileStream("jsonのパス", FileMode.Open, FileAccess.Read)) 7 using (var stream = new MemoryStream(req.downloadHandler.data)) 8 { 9 // 以下略

投稿2020/06/01 14:03

編集2020/06/01 15:00
katsuko

総合スコア3538

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

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

momo_74

2020/06/01 14:38

ありがとうございます。StreamingAssetsの使い方の参考になります。 申し訳ないのですが、自分の勉強不足でgoogle calendar apiの使い方がいまいち分からず、認証等が以下の方法でしか分かりません。 using (var stream = new FileStream("jsonのパス", FileMode.Open, FileAccess.Read)) { string credPath = Application.persistentDataPath;//トークンの保存先 credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "サービスアカウントのアドレス", CancellationToken.None, new FileDataStore(credPath)).Result; } jsonの中身ではなくjsonのファイルパスが必要のようです。
momo_74

2020/06/03 10:14

MemoryStreamを使ったところ、 `PlatformNotSupportedException: Operation is not supported on this platform.` と出てしまいました。 yield return req.SendWebRequest(); の先に処理を続けて書いたのですが、使い方が間違っているのでしょうか?
katsuko

2020/06/03 15:40

そもそも、Unityをサポートしているんですかね? 先も言ったとおり、自分はGoogleCalendarAPIは知らないんですが、 https://developers.google.com/calendar/quickstart/dotnet#step_3_set_up_the_sample おそらくこのサンプルを見ているようですが、そのサンプルが置いてあるGitHubのReadme https://github.com/gsuitedevs/dotnet-samples に、 > G Suite APIs use the Google API .NET client library. とあって、更にそのリンク先である https://github.com/googleapis/google-api-dotnet-client を見てみると、「Unsupported Frameworks」に「Unity」と書いてあります。 (だから、PlatformNotSupportedExceptionが発生しているのでは) もしダメなら、androidでGoogleCalendarAPIを使う方法を模索して、それをネイティブプラグインとしてUnityから呼び出すほうがいいかもしれません。まぁ、それはそれで大変そうですが。
momo_74

2020/06/04 10:04

PCアプリ向けにjsonのパスをPC版の物に変更しビルドすると動くので、恐らくUnityでも動くと思います。 デバッグログを出してみたところ、req.downloadHandler.dataの中身のパスがjsonファイルまで届いていないようです。とりあえず、jsonファイルまでのパスを先頭のスラッシュなしで取得したいです。
katsuko

2020/06/04 13:34

https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) > プラットフォーム(英: computing platform)とは、コンピュータにおいて、主に、オペレーティングシステム (OS) やハードウェアといった基礎部分を指す。 PlatformNotSupportedですから、違うプラットフォーム(PC)で動いたなんて話は全く参考になりません。 req.downloadHandler.dataの中にパスなんか入っていませんよ。 そもそも、MemoryStreamが何なのか、理解していますか? もし理解していないのであれば、改めて理解することをおすすめします。 それから、androidのstreamingAssetsPathですが、 https://docs.unity3d.com/ja/2018.4/Manual/StreamingAssets.html > アンドロイドでは、ファイルは圧縮された .jar ファイル (基本的には標準的な ZIP 圧縮形式と同じ) に格納されます。ファイルの取得に Unity の WWW クラスを使用しない場合は、.jar アーカイブからファイルを取り出すために、追加のソフトウェアが必要です。 です。 要は、通常のファイルとは違いますから、パスをどうこうしたところで、FileStreamでは簡単にアクセスできません。
momo_74

2020/06/04 17:10

すいません、初心者なのでMemoryStreamが何なのか分かりませんでした。 ここでの質問も初めてだったので、お見苦しい質問をして申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問