GreeのWebViewプラグインを利用し、Unity内でWebViewを実装しています。
https://github.com/gree/unity-webview
通常のWEBページの表示は正常に行われているのですが、input type=“file”が動作しません。
AndroidのWebViewではinput fileが動作しないとのことで、色々なサイトを見ながらカスタマイズを行ってみたのですが、どうしても上手くいきません。どなたかお力をお貸しして頂けないでしょうか。
■動作環境
・Unity 5.3
・Android Studio 1.5.1
・サーバーサイド:AngulerJS
■想定する動き
・inputボタン→画像管理アプリの選択→画像の選択
・選択画像はAngulerJSのdirectiveにより、そのままページ上に表示される
・送信ボタンを押すと選択画像がアップロードされる
※WebViewではなく各端末の標準ブラウザを使用した場合、上記が正常に行われることは確認しています。
※ちなみにiOS端末では、このカスタマイズ無しでも正常に動作しています。
■OS 4.2.2での動作
・inputボタン→画像管理アプリの選択→画像の選択:正常に可能
・選択された画像がページ上に表示されない
・送信ボタンを押すと選択画像がアップロードされる
■OS 4.4.4での動作
・inputボタン→画像管理アプリの選択→画像の選択:正常に可能
・選択された画像がページ上に表示されない
・送信ボタンを押しても選択画像がアップロードされない
なにとぞ宜しくお願い致します。
java
1//カスタマイズしたWebViewPlugin 2 3package net.gree.unitywebview; 4//一部省略 5public class WebViewPlugin 6{ 7//略 8 public void Init(final String gameObject) 9 { 10 final Activity a = UnityPlayer.currentActivity; 11 a.runOnUiThread(new Runnable() {public void run() { 12 a.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 13 a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 14//略 15 /* 既存のメソッドをコメントアウト 16 mWebView.setWebChromeClient(new WebChromeClient() { 17 public boolean onConsoleMessage(android.webkit.ConsoleMessage cm) { 18 Log.d("Webview", cm.message()); 19 return true; 20 } 21 }); 22 */ 23 24//追記ここから 25 mWebView.setWebChromeClient(new WebChromeClient() { 26 // For Android < 3.0 27 public void openFileChooser(ValueCallback<Uri> uploadFile) { 28 openFileChooser(uploadFile, ""); 29 } 30 31 // For 3.0 <= Android < 4.1 32 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) { 33 openFileChooser(uploadFile, acceptType, ""); 34 } 35 36 // For 4.1 <= Android < 5.0 37 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) { 38 if(mUploadMessage != null){ 39 mUploadMessage.onReceiveValue(null); 40 } 41 mUploadMessage = uploadFile; 42 43 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 44 intent.addCategory(Intent.CATEGORY_OPENABLE); 45 intent.setType("image/*"); 46 47 a.startActivityForResult(intent, FILECHOOSER_RESULTCODE); 48 } 49 }); 50//追記ここまで 51//以下略 52 }); 53 } 54}
java
1//オーバーライドしたUnityPlayerActivity 2public class OverrideActivity extends UnityPlayerActivity { 3 private final static int FILECHOOSER_RESULTCODE = 1; 4 5 protected void onActivityResult(int requestCode, int resultCode,Intent intent) { 6 if (requestCode != FILECHOOSER_RESULTCODE) { 7 super.onActivityResult(requestCode, resultCode, intent); 8 return; 9 } 10/* どうしてもBuild.VERSION_CODES.LOLIPOPがcannot resolve symbolになるため、とりあえずコメントアウト中 11 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLIPOP) { 12 if (WebViewPlugin.mFilePathCallback == null) { 13 super.onActivityResult(requestCode, resultCode, intent); 14 return; 15 } 16 Uri[] results = null; 17 18 // Check that the response is a good one 19 if (resultCode == RESULT_OK) { 20 String dataString = intent.getDataString(); 21 if (dataString != null) { 22 results = new Uri[] { Uri.parse(dataString) }; 23 } 24 } 25 26 WebViewPlugin.mFilePathCallback.onReceiveValue(results); 27 WebViewPlugin.mFilePathCallback = null; 28 } else { 29 */ 30 if (WebViewPlugin.mUploadMessage == null) { 31 super.onActivityResult(requestCode, resultCode, intent); 32 return; 33 } 34 35 Uri result = null; 36 37 if (resultCode == RESULT_OK) { 38 if (intent != null) { 39 result = intent.getData(); 40 } 41 } 42 43 WebViewPlugin.mUploadMessage.onReceiveValue(result); 44 WebViewPlugin.mUploadMessage = null; 45 //} 46 } 47}
■3/29 23:25追記
あれから精査したところ、上記コードは正しく動作していたようで、WebView(HTML)によるfileの受け取りは成功していました。
ただ、file.nameは取得出来るものの、file.typeがnullになっています。
(このせいで以後の動作が行われていませんでした)
もう暫く調べてみますが、こちらについて対処方法をご存知の方がいらっしゃいましたら教えて頂けると助かります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/29 11:14
2016/03/29 11:55