Android:讓WebView支持<input type=”file”…>元素

来源:http://www.cnblogs.com/studycc/archive/2016/12/09/6148412.html
-Advertisement-
Play Games

最近在做一個活動頁面:用戶上傳一張圖片進行縮放、旋轉後點擊下一步填寫內容後生成圖片! 做好後經過各種測試是沒有問題的,基本沒有什麼明顯BUG,流程都能走通,但是嵌入到APP後,問題就來了! 在IOS上基本還可以,在Android上有明顯問題,下麵就是我要講的: 在Android中,當我們通過WebV ...


最近在做一個活動頁面:用戶上傳一張圖片進行縮放、旋轉後點擊下一步填寫內容後生成圖片!

做好後經過各種測試是沒有問題的,基本沒有什麼明顯BUG,流程都能走通,但是嵌入到APP後,問題就來了!

在IOS上基本還可以,在Android上有明顯問題,下麵就是我要講的:

在Android中,當我們通過WebView打開一個頁面時,如果裡面有元素是<input type=”file”…>類型的,WebView只能正常的顯示樣式,但是是無法點擊的。要解決這個問題,我們需要重寫WebChromeClient。

下麵直接給出Demo代碼:

Activity文件:

public class MainActivity extends Activity {

    private final String host = "demo.com";
    private final String urlAddress = "http://" + host;

    private WebView web;
    private ProgressBar progressBar;

    private ValueCallback<Uri> mUploadMessage;
    private final static int FILECHOOSER_RESULTCODE = 1;

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent intent) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage) return;
            Uri result = intent == null || resultCode != RESULT_OK ? null
                    : intent.getData();
            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }
    }

    /**
     * Called when the activity is first created.
     */
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        web = (WebView) findViewById(R.id.webView1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);

        WebSettings settings = web.getSettings();
        settings.setJavaScriptEnabled(true);
        web.loadUrl(urlAddress);
        web.setWebViewClient(new MyWebViewClient());

        web.setWebChromeClient(new WebChromeClient() {
            //關鍵代碼,以下函數是沒有API文檔的,所以在Eclipse中會報錯,如果添加了@Override關鍵字在這裡的話。

            // For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg) {

                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);

            }

            // For Android 3.0+
            public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                MainActivity.this.startActivityForResult(
                        Intent.createChooser(i, "File Browser"),
                        FILECHOOSER_RESULTCODE);
            }

            //For Android 4.1
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");
                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FILECHOOSER_RESULTCODE);

            }
        });

//        setContentView(web);
    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals(host)) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);

            progressBar.setVisibility(View.GONE);
        }
    }


    //flipscreen not loading again
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    // 捕捉“回退”按鍵,讓WebView能回退到上一頁,而不是直接關閉Activity。
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
            web.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Layout代碼就不貼出來了,就是很簡單的一個WebView和一個Progress。通過以上代碼,我們就能夠在WebView中上傳文件了。

 

PS: 和iOS比起來,這不是一個完美的解決方案,因為它不支持直接拍照上傳文件,如果需要這個功能的話,那麼還需要做進一步的開發才行。

原文地址:Android:讓WebView支持input: file元素


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載地址:http://blog.csdn.net/rowland001/article/details/50886288 從今天開始呢,我要開始學習Google家自己出的Android代碼示例,總覺得這才是原汁原味的。 我用的是Google自家的Android Studio,目前是這個版本: 其實 ...
  • Android打電話有兩種實現方法: 第一種方法,撥打電話跳轉到撥號界面。源代碼如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setDa ...
  • 在iOS開發過程中經常需要通過網路請求載入圖片,有時,需要在創建UIImageView或UIButton來顯示圖片之前需要提前知道圖片的尺寸,根據圖片尺寸創建對應大小的控制項。但是對於網路圖片來說,要想通過最優的方法獲得尺寸就略微有點困難,大體思路就是下麵這種: 如果有使用SDWebImage,則首先 ...
  • 由於我是在win7的環境下,在這裡就以win7系統為例進行講解了。 首先需要在nodejs官網下載最新版的node.js,下載完畢直接安裝即可,安裝成功後在cmd命令行中執行node指令,如下結果就說明安裝成功 node安裝成功後會自動安裝npm(包管理器,編譯源代碼安裝需要手動安裝),這是Node ...
  • 前提: 1.安裝Android Studio(過程略) 2.官網下載OpenCV for Android 網址:http:opencv.org/downloads.html 我下載的是下圖的版本 3.將下載好的OpenCV for Android解壓到固定文件夾 4.新建一個android項目(就新 ...
  • 最近新項目需要編譯64位的動態庫,這裡記錄如何配置。 在jni目錄下加入Android.mk和Application.mk文件。 Application.mk Android.mk 加上這兩個mk文件後,編譯就會生成armeabi、armeabi-v7a、arm64-v8a的庫文件。 補充: And ...
  • 通過項目學習收穫更大。 1、基於Android平臺實戰愛簡訊項目 下載地址:http://pan.baidu.com/s/1hr8CEry 2、Android平臺實戰CRM客戶關係管理(AChartEngine統計圖表、非同步任務、系統性能優化) 下載地址: http://pan.baidu.com/ ...
  • 有的時候會碰到軟鍵盤不好關閉,然後就去調界面代碼,發現不行,說到底還是對軟鍵盤不熟悉的原因,軟鍵盤windowSoftInputMode有很多種 如果你預設的activity的模式為預設的,或者stateHidden|adjustPan等,那你在某些情況下是關不了( hideSoftInputFro ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...