今までUnityで作っていたアプリを改修する際、Unityがバージョン4.6をリリースしていたのでアップデートした所、今までは正常に動いていたCaptureScreenshotが動かなくなってしまいました。
しかも、何故かDevelopment Buildで動作させるとちゃんと画像が保存されるといった状況です。調べてみたところ、通常のビルドとDevelopment Buildではインストールされるディレクトリが異なっており、相対パスの指定が正常に動作していませんでした。
対処法としては、相対パスを書きなおしてやればいいのですが、その方法がやっとわかったので書いていきます。
以前CaptureScreenshotはこちらに書いてある内容を参考に作成しました。
ここに書いてある内容を以下のように書き換えたところ、正常にパスが取得でき動作させることが出来ました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
IEnumerator cap(){ using (AndroidJavaClass jcUnityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject joActivity = jcUnityPlayer.GetStatic<AndroidJavaObject> ("currentActivity")) using (AndroidJavaObject joContext = joActivity.Call<AndroidJavaObject> ("getApplicationContext")) using (AndroidJavaClass jcMediaScannerConnection = new AndroidJavaClass ("android.media.MediaScannerConnection")) using (AndroidJavaClass jcEnvironment = new AndroidJavaClass ("android.os.Environment")) using (AndroidJavaObject joExDir = jcEnvironment.CallStatic<AndroidJavaObject> ("getExternalStorageDirectory")) { string path = ""; string fileName = ""; fileName = "screenshot" + System.DateTime.Now.Ticks.ToString () + ".png"; path = "../../../../../.." + joExDir.Call<string> ("toString") + "/DCIM/Camera/" + fileName; path = path + fileName; Application.CaptureScreenshot (path); yield return 0; ScanMedia (fileName); } } static void ScanMedia (string fileName){ if (Application.platform != RuntimePlatform.Android) return; #if UNITY_ANDROID using (AndroidJavaClass jcUnityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject joActivity = jcUnityPlayer.GetStatic<AndroidJavaObject> ("currentActivity")) using (AndroidJavaObject joContext = joActivity.Call<AndroidJavaObject> ("getApplicationContext")) using (AndroidJavaClass jcMediaScannerConnection = new AndroidJavaClass ("android.media.MediaScannerConnection")) using (AndroidJavaClass jcEnvironment = new AndroidJavaClass ("android.os.Environment")) using (AndroidJavaObject joExDir = jcEnvironment.CallStatic<AndroidJavaObject> ("getExternalStorageDirectory")) { string path = "/DCIM/Camera/" + fileName; Debug.Log ("search path : " + path); jcMediaScannerConnection.CallStatic ("scanFile", joContext, new string[] { path }, new string[] { "image/png" }, null); } Handheld.StopActivityIndicator(); #endif } |
書き換えた箇所は、保存するときのパスの指定と、メディアスキャンするパスが変わっています。
“../../../../DCIM/Camera/“ではインストールされているディレクトリが変わってしまっているためCameraディレクトリにたどり着くことができません。
そこで、まずルートディレクトリまで移動したあと、joExDir.Call<string> (“toString”)を指定することで、DCIMが格納されている内部ストレージのトップディレクトリを取得する事ができるので、これでファイルを保存することができます。
また、メディアスキャンをするときは逆にjoExDir.Call<string> (“toString”)を省いて記述しないとちゃんとしたパスが得られませんでした。
以前は特に問題なく動作していたところなので、Unity側のバグなのか新しい仕様なのかはわかりませんが、とりあえず動かす分にはこれで問題なさそうです。
原因がわかるまでにも多少時間がかかりましたが、対処するまでもかなり時間がかかってしまいました。
意外とこのことについて書いてある記事が見つからなかったので参考にしていただければと思います。
では、また