當前位置:首頁 » 安卓系統 » androidwebview文件上傳

androidwebview文件上傳

發布時間: 2023-03-28 01:10:37

⑴ 把HTML5的手機網站嵌入安卓APP中,發現<input type='file' />的上傳按鈕功能失效,點擊沒有任何反應

安卓APP的WebView默認屏蔽了該控制項的使用,有些安卓APP之所以能支持文件選擇和上傳,主要可能是有可能採取了如下措施之一:

(1)可能在該APP中重寫了相關方法(http://stackoverflow.com/questions/5907369/file-upload-in-webview)

(2)提供了JS Bridge來供web頁面調用

所以,單從前端技術上是解決不了這個問題的。

這個問題之所以不太好排查,一方面跟手機端的圖片上傳功能我不太常用到有很大關系,另一方面也因為見到一些其它的APP容器能支持該功能,所以思維在習慣上已經形成定勢,誤以為這是WebView默認就支持的。

末了,順便提醒一句,下次進行類似功能的需求評審,別忘了先了解下相應的APP容器是否支持該功能,如果沒有,則需要找到相應的客戶端開發同學評估一下工時,以免造成影響項目進度的風險








⑵ Android webview調取安卓原生相機和相冊上傳圖片

適配安卓10方式:
返回URI即可

手機上載入webview,網頁上上傳圖片調用原生相機和相冊上傳圖片

先設置好webview的載入以及websetting,這里就不多說了。

主要是setWebChromeClient方法的實現

這個方法分幾個版本的適配3.0以下的設備,3.0到4.1的設備,4.1到5.0的設備,以及5.0以上的設備,每個方法參數不一樣適配時請注意。5.0以下的參數都是 ValueCallback<Uri> ,以上的設備需要 ValueCallback<Uri[]> ,回傳數據的時候也是對應的不要弄錯了。

最後的效果如下:

⑶ Android 5.x 免 Root 升級系統 WebView

Android 的系統碎片化問題可以說是 Android 系統最大的硬傷了,自這個系統誕生以來十幾年過去了,依然沒能很好的解決,碎片化問題也是每個 Android 開發工程師心中的隱痛😂,每次處理系統碎片化帶來的問題時,血壓也能分分鍾飆升到 200+,為了減輕其他同仁的痛苦以及此後再遇到類似問題能少踩幾個坑,就之前的爬坑經歷做個記錄吧。

有關 WebieView 的重要性和其使用不是本文的重點,但是有幾個相關的屬性我們必須了解:

在Android4.4(API level 19)系統以前,Android使用了原生自帶的Android Webkit內核,這個內核對HTML5的支持不是很好,現在使用4.4以下機子的也不多了,就不對這個內核做過多介紹了,有興趣可以看下 這辯叢悶篇文章 。

從攜彎Android4.4系統開始,Chromium內核取代了Webkit內核,正式地接管了WebView的渲染工作。Chromium是一個開源的瀏覽器內核項目,基於Chromium開源項目修改實現的瀏覽器非常多,包括最著名的Chrome瀏覽器,以及一眾國內瀏覽器(360瀏覽器、QQ瀏覽器等)。其中Chromium在Android上面的實現是 Android System WebView ^1 。

從Android5.0系統開始,WebView移植成了一個獨立的apk,可以不依賴系統而獨立存在和更新,我們可以在 系統->設置->Android System WebView 看到WebView的當前版本。

從Android7.0系統開始,如果系統安裝了Chrome (version>51),那麼Chrome將會直接為應用的WebView提供渲染,WebView版本會隨著Chrome的更新而更新,用戶也可以選擇WebView的服務提供方(在開發者選項->WebView Implementation里),WebView可以脫離應用,在一個獨立的沙盒進程中渲染頁面(需要在開發者選項里打開) ^2 。

從Android8.0系統開始,默認開啟WebView多進程模式,即WebView運行在獨立的沙盒進程中 ^3 。―― 節選自 如何設計一個優雅健壯的Android WebView?(上)

WebView 的包名在 AOSP 中的值是 com.android.webview ,該值是在 AOSP 構建過程中編譯的版本,也就是說它是和系統一起被編譯出來的,由於大部分的第三方手機製造商都有自己的定製 ROM,所以包名也是不盡相同,比如 MIUI ROM 中它已經被改為 com.mi.webkit.core 。從 WebView 的版本歷史中可以看到自 Android 5.0 開始 WebView 移植成了一個獨立的 apk,可以不依賴系統而獨立存在和更新,這時候起 WebView 的包名就正式改為 com.google.android.webview 了。

所以這就是鄭核為什麼網上一堆人問為啥升級了一下系統 WebView ,App 內使用到 WebView 的地方或者是內置瀏覽器一碰就報 PackageManager$NameNotFoundException: com.google.android.webview 或者 PackageManager$NameNotFoundException: com.android.webview 之類的錯誤,這些問題在 Android 5.0 的機器上非常常見,因為你升級了 WebView 之後 TMD 包名都變了🤣,而 ROM 定製商一般在版本銜接時都很保守,所以即使系統升到了 Android 5.0 ,解決方案未必就是最新的,內置的 WebView 依然可能是硬編碼進 ROM 的,所以系統環境引用的包名可能依舊是 com.android.webview ,你升級到 com.google.android.webview 它當然不認識了😂。

通過上面一通廢話,你應該知道了,替換的坑就在如果你換上去的 WebView 包名和原內置的 WebView 包名不一致,就無法使用,所以就需要找一個包名一致的高版本 APK 了,還有一種方法是在系統目錄某個配置文件里改個什麼值,也就是包名引用,這樣你就能換成任何包名的 APK 了,這個暫時沒仔細研究,後續有結果了再更新。

APKMirror 是一個 APK 鏡像站點,在這里可以找到很多 APK 的 release 版本以及歷史版本,尤其 Google 全家桶系列的 APK 非常全,我們在這里根據需求直接搜索包名就可以了,我這里需要 com.android.webview ,檢索到如下結果,可以看到這些都是從第三方 ROM 里提取出來的。

因為 Google 官方早在 WebView 40 的時候就已經將包名換成 com.google.android.webview 了,最新的是 72.xxx ,我翻了 15 頁才找到最早改名並獨立出來的那個版本😂。

adb connect 192.168.18.235

adb shell

su

mount -o rw,remount /system

這里原目錄下的文件分別有 /webview/webview.apk 和 /webview/lib/arm/libwebviewchromium.so ,備份原目錄:

cd /system/app
mv webview/ webview-b/
mkdir -p webview/lib/arm/

這里很簡單,文件後綴 .apk 直接改成 .zip 然後解壓縮,復制出 libwebviewchromium.so 即可

先上傳文件到設備 /sdcard ,然後執行如下命令移動過去,和原路徑以及原文件名保持一致即可。

mv /sdcard/xxx.apk /system/app/webview/webview.apk

mv /sdcard/xxx.so /system/app/webview/lib/arm/libwebviewchromium.so

cd /system/app/
chmod 777 webview/*

adb reboot

如上一頓操作,其實也沒什麼難度,主要的坑就是包名一致的問題,還有一些系統目錄訪問許可權之類的問題,之前網上搜了好多,都說不 root 沒法換,或者換了會出問題,root 許可權其實就是為了訪問和寫入系統目錄,通過重新掛載就解決了,換了會崩掉的問題其實就是歷史遺留問題,從 4.x 過度到 5.0 WebView 獨立了,所以包名變了,或者是 ROM 定製方不按套路來導致換上去的 WebView 不被系統識別,只要找到合適的包就解決了。

⑷ android的本地視頻,如何遠程可以觀看

android 端用WEBVIEW可以做 ,WEBVIEW可以載入你伺服器上的網站,裡面上傳視頻,客戶端可以直接播放網路視頻,當然也可以下載下來播放,就是用輸入輸出流做。可以選擇用HTTP協議訪問網站資源,也可以用socket

⑸ android 怎麼在webview上添加照片

webview上添加照片的話,是需要使用js,生成一個html界面,裡面寫上圖片就可以

⑹ webView文件上傳取消彈窗後再次點擊不響應點擊事件問題

移動端H5頁面調用手機相冊或者照相機後,再次點擊沒反應問題,這是需要安卓方面修改的,前端不需要修改。

實現方法是

webView_customer.setWebChromeClient(new WebChromeClient() {

// For Android 3.0+

public void openFileChooser(ValueCallback uploadMsg, String acceptType) {

mUploadMessage = uploadMsg;

ArrayList list = new ArrayList();

list.add("拍照");

list.add("從相冊選擇");

showTakePicOrPhotoesDialog(Activity_Customer_E.this, "選擇", list, new DialogUtils.OnClickPicDialogItemListener() {

@Override

public void onClickItem(int which) {

if(0==which){

Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//下面這句指定調用相機拍照後的照片存儲的路徑

try {

File file = 銷春createImageFile();

takePicUri = Uri.fromFile(file);

takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, takePicUri);

startActivityForResult(takeIntent, FILECHOOSER_RESULTCODE);

} catch (IOException e) {

e.printStackTrace();

}

}else if(1==which){

Intent pickIntent = new Intent(Intent.ACTION_PICK, null);                            pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");

startActivityForResult(pickIntent, FILECHOOSER_RESULTCODE);

}

}

});

}

// For Android < 3.0

public void openFileChooser(ValueCallback uploadMsg) {

openFileChooser(uploadMsg, "");

}

/虧絕耐/ For Android  > 4.1.1

public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {

openFileChooser(uploadMsg, acceptType);

}

// For Android 5.0+

public boolean onShowFileChooser (WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {

mUploadCallbackAboveL = filePathCallback;

ArrayList list = new ArrayList();

list.add("拍照");

list.add("從相冊選擇");

showTakePicOrPhotoesDialog(Activity_Customer_E.this, "選擇", list, new DialogUtils.OnClickPicDialogItemListener() {

@Override

public void onClickItem(int which) {

if(0==which){

Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//下宏判面這句指定調用相機拍照後的照片存儲的路徑

try {

File file = createImageFile();

takePicUri = Uri.fromFile(file);

takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, takePicUri);

startActivityForResult(takeIntent, FILECHOOSER_RESULTCODE);

} catch (IOException e) {

e.printStackTrace();

}

}else if(1==which){

Intent pickIntent = new Intent(Intent.ACTION_PICK, null);

pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");

startActivityForResult(pickIntent, FILECHOOSER_RESULTCODE);

}

}

});

return true;

}

});

OnActivityResult回調方法:這里有個特別注意的地方,當打開拍照按鈕時,Intent data這個數據是空,所以不能正常上傳,打開拍照的Intent當時傳了一個Uri,在OnActivityResult需要判斷data是不是空,是空的話,就把傳的那個Uri賦值給mUploadMessage.onReceiveValue,如果不為空就傳data.getData();具體如下:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode==FILECHOOSER_RESULTCODE){

Uri result;

if (null == mUploadMessage && null == mUploadCallbackAboveL){

return;

}

//如果拍完照點擊取消按鈕就:if(resultCode ==RESULT_CANCELED){    result = Uri.EMPTY;}else{if(data ==null&& resultCode !=RESULT_OK){        result = Uri.EMPTY;    }else if(data ==null){        result =takePicUri;    }else{        result = data.getData();    }}

if (mUploadMessage != null) {

mUploadMessage.onReceiveValue(result);

mUploadMessage = null;

}

if(mUploadCallbackAboveL!=null) {mUploadCallbackAboveL.onReceiveValue(newUri[]{result});mUploadCallbackAboveL=null;}

}

}

這里有一個問題,點擊「取消」或返回按鈕,無法重復回調onShowFileChooser或openFileChooser方法。解決辦法:

定義一個方法:

/**

*防止點擊dialog的取消按鈕之後,就不再次響應點擊事件了

*/

public static void cancelCallback(){

if(mUploadCallbackAboveL!=null){

mUploadCallbackAboveL.onReceiveValue(null);

}

if(mUploadMessage!=null){

mUploadMessage.onReceiveValue(null);

}

}

在彈窗(dialog)的取消按鈕監聽的方法中調用上面的cancellCallBack方法。比如我的:

/**

*展示拍照或者從相冊選擇的Dialog

* @param context

* @param title

* @param names

* @param onClickPicDialogItemListener

*/

public static void showTakePicOrPhotoesDialog(Context context, String title, final ArrayList names, final DialogUtils.OnClickPicDialogItemListener onClickPicDialogItemListener){

AlertDialog.Builder builder=new AlertDialog.Builder(context);

builder.setTitle(title);//設置標題

String[] itemList=(String[]) names.toArray(new String[names.size()]);

builder.setItems(itemList, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

onClickPicDialogItemListener.onClickItem(which);

}

});

AlertDialog dialog=builder.create();//獲取dialog

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {

@Override

public void onCancel(DialogInterface dialog) {

cancelCallback();

}

});

dialog.show();//顯示對話框

}

⑺ android webview 怎樣載入本地css

第一步:將資源拷貝到assets目錄
第二步:給需要注入的資源文件在url上做一個標志,當然,你也可以不做,只要你在安卓端可以判斷出來即可。
<link rel="stylesheet" href="[inject]public/css/bootstrap.min.css" type="text/css" media="screen" title="no title" charset="utf-8">
<link rel="stylesheet" href="[inject]public/css/bootstrap-theme.min.css" type="text/css" media="screen" title="no title" charset="utf-8">
<script type="text/javascript" src="[inject]public/js/zipto/1.1.6/zepto.min.js"></script>
<script type="text/javascript" src="[inject]public/js/moles/md5.min.js"></script>

第三步:攔截將要注入的文件,讀取本地文件即可。
webview.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
//System.out.println("WebResourceResponse::"+url);
if(url.contains("[inject]")){
String localPath = url.replaceFirst("^http.*inject\\]","");
System.out.println("LocalPath::"+localPath);
try {
InputStream is = getApplicationContext().getAssets().open(localPath);
return new WebResourceResponse("text/javascript", "UTF-8", is);
} catch (Exception e) {
e.printStackTrace();
return super.shouldInterceptRequest(view, url);
}
} else {
return super.shouldInterceptRequest(view, url);
}
}
});

⑻ webview觸摸屏上傳程序失敗

網路問念慎題。Android原生的WebView並不支持上傳文件,但webview觸摸屏上傳程序是使用vantui進行和純上傳的,上傳程序失敗大多數的原喚高咐因數網路的問題,上傳程序對於網路的要求很高。

⑼ Android webview 上傳圖片為什麼 application/octet-stream

首先得找出問題的原因,你不妨做以下測試,看下問題是處在那端

  • 用其他的軟體測試Server看是不是伺服器配置的事

  • 你寫的Webview,Mainfest賦權是否正確

⑽ WebView中的文件選擇

參考:
Android使用WebView載入網頁選擇文件上傳

熱點內容
1970linux 發布:2025-07-05 12:12:43 瀏覽:108
解壓挑刺 發布:2025-07-05 12:12:12 瀏覽:535
rarlinux壓縮 發布:2025-07-05 12:08:52 瀏覽:398
手機點菜app怎麼連接電腦伺服器 發布:2025-07-05 11:13:05 瀏覽:943
配置控制台干什麼用的 發布:2025-07-05 10:54:51 瀏覽:962
連信從哪裡改登錄密碼 發布:2025-07-05 10:54:12 瀏覽:399
怎麼修改查詢密碼 發布:2025-07-05 10:49:48 瀏覽:967
matlab文件存儲 發布:2025-07-05 10:40:46 瀏覽:85
梅州市用工實名制管理平台雲存儲 發布:2025-07-05 10:28:59 瀏覽:77
安卓origin怎麼設置 發布:2025-07-05 10:20:10 瀏覽:543