首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android WebView H5 圖片上傳不觸發 change 事件:缺少 WebChromeClient 文件選擇器支持

     編輯:程式設計疑難解答

現象:iOS 正常喚起相機/相冊,Android WebView 點擊 <input type="file"> 無反應,不觸發 change 事件。根因:Android WebView **默認不處理文件選擇**,必須設置 WebChromeClient 並實現 onShowFileChooser / openFileChooser 系列回調。

完整兼容代碼 (API 21+ / 兼容舊版)

webView.setWebChromeClient(new WebChromeClient() {
    // Android 5.0+ (API 21)
    @Override
    public boolean onShowFileChooser(WebView webView,
            ValueCallback filePathCallback,
            FileChooserParams fileChooserParams) {
        mUploadCallbackAboveL = filePathCallback;
        openFileChooserIntent();
        return true;
    }

    // Android 3.0 - 4.4
    public void openFileChooser(ValueCallback uploadMsg) {
        mUploadMessage = uploadMsg; openFileChooserIntent();
    }
    public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
        mUploadMessage = uploadMsg; openFileChooserIntent();
    }
    public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
        mUploadMessage = uploadMsg; openFileChooserIntent();
    }
});

private void openFileChooserIntent() {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("image/*");
    Intent chooser = Intent.createChooser(i, "選擇圖片");
    startActivityForResult(chooser, FILECHOOSER_RESULTCODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FILECHOOSER_RESULTCODE) {
        if (mUploadCallbackAboveL != null) { // API 21+
            Uri[] results = data == null ? null : new Uri[]{data.getData()};
            mUploadCallbackAboveL.onReceiveValue(results);
            mUploadCallbackAboveL = null;
        } else if (mUploadMessage != null) { // 旧版
            mUploadMessage.onReceiveValue(data == null ? null : data.getData());
            mUploadMessage = null;
        }
    }
}

關鍵點

  • 必須在 Activity 中處理 onActivityResult 回傳 Uri 給回調
  • VALUE_CALLBACK 變量需為成員變量,防止被 GC
  • 權限:READ_EXTERNAL_STORAGE 動態申請
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved