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

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

ただいまの
回答率

90.47%

  • Java

    14101questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

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

  • Unity

    4197questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Webサイト

    1099questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • AngularJS

    570questions

    AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

AndroidでのWebviewでinput type="file"が受け取れない(Unity/AngularJS)

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,823

sakura_hana

Unity総合1位

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ボタン→画像管理アプリの選択→画像の選択:正常に可能
・選択された画像がページ上に表示されない
・送信ボタンを押しても選択画像がアップロードされない

なにとぞ宜しくお願い致します。

//カスタマイズしたWebViewPlugin

package net.gree.unitywebview;
//一部省略
public class WebViewPlugin
{
//略
    public void Init(final String gameObject)
    {
        final Activity a = UnityPlayer.currentActivity;
            a.runOnUiThread(new Runnable() {public void run() {
            a.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//略
            /* 既存のメソッドをコメントアウト
            mWebView.setWebChromeClient(new WebChromeClient() {
                public boolean onConsoleMessage(android.webkit.ConsoleMessage cm) {
                    Log.d("Webview", cm.message());
                    return true;
                }
            });
            */

//追記ここから
            mWebView.setWebChromeClient(new WebChromeClient() {
                // For Android < 3.0
                public void openFileChooser(ValueCallback<Uri> uploadFile) {
                    openFileChooser(uploadFile, "");
                }

                // For 3.0 <= Android < 4.1
                public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {
                    openFileChooser(uploadFile, acceptType, "");
                }

                // For 4.1 <= Android < 5.0
                public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
                    if(mUploadMessage != null){
                        mUploadMessage.onReceiveValue(null);
                    }
                    mUploadMessage = uploadFile;

                    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                    intent.addCategory(Intent.CATEGORY_OPENABLE);
                    intent.setType("image/*");

                    a.startActivityForResult(intent, FILECHOOSER_RESULTCODE);
                }
            });
//追記ここまで
//以下略
        });
    }
}
//オーバーライドしたUnityPlayerActivity
public class OverrideActivity extends UnityPlayerActivity {
    private final static int FILECHOOSER_RESULTCODE = 1;

    protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
        if (requestCode != FILECHOOSER_RESULTCODE) {
            super.onActivityResult(requestCode, resultCode, intent);
            return;
        }
/* どうしてもBuild.VERSION_CODES.LOLIPOPがcannot resolve symbolになるため、とりあえずコメントアウト中
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLIPOP) {
            if (WebViewPlugin.mFilePathCallback == null) {
                super.onActivityResult(requestCode, resultCode, intent);
                return;
            }
            Uri[] results = null;

            // Check that the response is a good one
            if (resultCode == RESULT_OK) {
                String dataString = intent.getDataString();
                if (dataString != null) {
                    results = new Uri[] { Uri.parse(dataString) };
                }
            }

            WebViewPlugin.mFilePathCallback.onReceiveValue(results);
            WebViewPlugin.mFilePathCallback = null;
        } else {
            */
            if (WebViewPlugin.mUploadMessage == null) {
                super.onActivityResult(requestCode, resultCode, intent);
                return;
            }

            Uri result = null;

            if (resultCode == RESULT_OK) {
                if (intent != null) {
                    result = intent.getData();
                }
            }

            WebViewPlugin.mUploadMessage.onReceiveValue(result);
            WebViewPlugin.mUploadMessage = null;
        //}
    }
}

■3/29 23:25追記
あれから精査したところ、上記コードは正しく動作していたようで、WebView(HTML)によるfileの受け取りは成功していました。
ただ、file.nameは取得出来るものの、file.typeがnullになっています。
(このせいで以後の動作が行われていませんでした)
もう暫く調べてみますが、こちらについて対処方法をご存知の方がいらっしゃいましたら教えて頂けると助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

確認ですReadme.mdより

Notes on Adnroid
Once you built an apk, please copy sample/Temp/StatingArea/AndroidManifest-main.xml to sample/Assets/Plugins/AndroidManifest.xml, edit the latter to add android:hardwareAccelerated="true" to <activity android:name="com.unity3d.player.UnityPlayerActivity" ..., and rebuilt the apk. Although some old/buggy devices may not work well with android:hardwareAccelerated="true", the webview runs very smoothly with this setting.

こちらは試されていますか?

Android実機が古いとだめなようですが
APIは何の実機を使ってのエラーでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/29 20:14

    ご指摘の設定は入っています。
    Android StudioのProjectSDKは「Android API 19 Platform」、
    端末はOS4.2.2(API17)、OS4.4.4(API19)です。
    なお、WebViewのinput file以外の部分は改変前・改変後共に正常に動いています。

    キャンセル

  • 2016/03/29 20:55

    >端末はOS4.2.2(API17)、OS4.4.4(API19)です。

    失礼しました。Android 4.2.2 と Android 4.4.4ですね

    >This is a well-known issue, unfortunately. Google deliberately disabled it in 4.2, and it's still broken as of 4.4 --

    [Issue Tracker](https://code.google.com/p/android/issues/detail?id=62220)

    だそうですが、workaroundとしてはこちらを試してみてはどうでしょう
    [Stackoverflow](http://stackoverflow.com/questions/26101065/choose-file-to-upload-on-webview-android-kitkat-4-4-2)



    This is a well-known issue, unfortunately. Google deliberately disabled it in 4.2, and it's still broken as of 4.4 --


    workaroundですが

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14101questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6629questions

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

  • Unity

    4197questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Webサイト

    1099questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • AngularJS

    570questions

    AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。