Andoridはwebviewを使ってファイルのピットをアップロードします

2531 ワード

プロジェクトのニーズのため、1つのh 5ページで画像アップロードの機能を実現する必要があります.実装のプロセスは、ユーザがクリックすると、webviewがこのイベントを傍受し、androidオリジナルの部分で選択した画像を取得し、経路をh 5ページに戻して処理し、アップロードすることである.この選択画像を傍受する傍受は、WebChromeClientを継承し、その中の方法を書き直す必要があります.各システムバージョンのwebviewの違いは、異なるシステムバージョンの携帯電話に適した方法を複数書き換える必要があるためです.コードは以下の通りです.
    private class MyWebClient extends WebChromeClient {
        // For Android 5.0+
        //    uris[]
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback valueCallback , FileChooserParams fileChooserParams) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--5.0+");
            mValueCallback = valueCallback;
            goToPhotos();
            return true;
        }

        // For Android 3.0+
        //       uri
        public void openFileChooser(ValueCallback uploadMsg) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0+");
            mValueCallbackSingle = uploadMsg;
            goToPhotos();
        }

        //3.0--  
        public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--3.0");
            openFileChooser(uploadMsg);
        }

        // For Android 4.1
        public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "openFileChooser--4.1");
            openFileChooser(uploadMsg);
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "newProgress--newProgress--"+newProgress);
            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            LuheLogUtils.LogI("LuheGoodsShowActivity", "onReceivedTitle--title--" + title);
            super.onReceivedTitle(view, title);
        }
    }
コードから開くと、リスニングのたびにvalueCallbackオブジェクトが返されます.このオブジェクトは、私たちが取得したピクチャパスをh 5ページに渡す責任を負います.
 mValueCallback.onReceiveValue(uris);
ただし、ここで注意すべき点は、一度にリスニングをトリガして戻ってきたmValue CallbackがonReceiveValueメソッドを呼び出していなければ、次のクリック時にリスニングを再度トリガーすることはないので、どうしても反応しない場合があり、この問題を解決するためにはピクチャパスが選択されていない場合にmValue Callbackが必要であることである.onReceiveValue(null)は空の値を伝え、画像が選択されていない後、次回クリックしても反応しないことはありません.最後にwebviewの穴が多いので、開発するときは注意してください.