WebView呼叫拍照與相簿(HTTPS無法顯示問題)
以前在使用webview的時候,H5裡面並沒有拍照與相簿的功能,這次遇到了,記錄一下。
android原生瀏覽器並不支援H5呼叫拍照與相簿,所以在webview使用中,需要使用Android的程式碼去呼叫。
程式碼如下:
public class MainActivity extends Activity {
public ValueCallback<Uri> mUploadMessage;
public ValueCallback<Uri[]> mUploadMessageForAndroid5;
public final static int FILECHOOSER_RESULTCODE = 1;
public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
private String mCameraFilePath;
Uri uri;
WebView mywebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mywebview = (WebView) findViewById(R.id.mywebview);
WebSettings settings = mywebview.getSettings();
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setDomStorageEnabled(true);
settings.setDefaultTextEncodingName("UTF-8");
settings.setAllowContentAccess(true); // 是否可訪問Content Provider的資源,預設值 true
settings.setAllowFileAccess(true); // 是否可訪問本地檔案,預設值 true
// 是否允許通過file url載入的Javascript讀取本地檔案,預設值 false
settings.setAllowFileAccessFromFileURLs(false);
// 是否允許通過file url載入的Javascript讀取全部資源(包括檔案,http,https),預設值 false
settings.setAllowUniversalAccessFromFileURLs(false);
settings.setJavaScriptCanOpenWindowsAutomatically(true);//允許js彈出視窗
//開啟JavaScript支援
settings.setJavaScriptEnabled(true);
// 支援縮放
settings.setSupportZoom(true);
mywebview.setLongClickable(true);
mywebview.setScrollbarFadingEnabled(true);
mywebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mywebview.setDrawingCacheEnabled(true);
mywebview.loadUrl(getIntent().getStringExtra("url") + "?phone=" + getIntent().getStringExtra("phone"));
mywebview.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Toast.makeText(MainActivity.this, "載入開始", Toast.LENGTH_LONG).show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Toast.makeText(MainActivity.this, "載入完成", Toast.LENGTH_LONG).show();
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Toast.makeText(MainActivity.this, "載入失敗", Toast.LENGTH_LONG).show();
}
});
mywebview.setWebChromeClient(
new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {// 載入進度改變而觸發
super.onProgressChanged(view, progress);
}
//擴充套件支援alert事件 webview不會展示Alert 所以需要我們自己展示
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setTitle("xxx提示").setMessage(message).setPositiveButton("確定", null);
builder.setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
result.confirm();
return true;
}
//擴充套件瀏覽器上傳檔案
//3.0++版本
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
openFileChooserImpl(uploadMsg);
}
//3.0--版本
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooserImpl(uploadMsg);
}
// For Android > 5.0
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
openFileChooserImplForAndroid5(uploadMsg);
return true;
}
}
);
}
/**
* 5.0以上的
*
* @param uploadMsg
*/
private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {
mUploadMessageForAndroid5 = uploadMsg;
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("image/*");
Intent xxx = createChooserIntent(createCameraIntent());
xxx.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
startActivityForResult(xxx, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
}
/**
* 5.0以下
*
* @param uploadMsg
*/
private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
Intent xxx = createChooserIntent(createCameraIntent());
xxx.putExtra(Intent.EXTRA_INTENT, i);
startActivityForResult(xxx, FILECHOOSER_RESULTCODE);
}
@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;
//5.0以下拍照是不是也要像5.0以上那樣處理拍照的事件呢?自己測試
} else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) {
//針對5.0的
if (null == mUploadMessageForAndroid5)
return;
Uri result = (intent == null || resultCode != RESULT_OK) ? null : intent.getData();
if (result != null) {
//相簿或者檔案
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
} else {
try {
File file = new File(new URI(uri.toString()));
//判斷此路徑是否存在 存在提供給網頁
if (file.exists()) {
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{uri});
return;
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
//這個必須呼叫 否則第二次點選 不會再出現彈窗提示
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
}
mUploadMessageForAndroid5 = null;
}
}
private Intent createCameraIntent() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File externalDataDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM);
File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
File.separator + "browser-photos");
cameraDataDir.mkdirs();
mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +
System.currentTimeMillis() + ".jpg";
uri = Uri.fromFile(new File(mCameraFilePath));
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
return cameraIntent;
}
private Intent createChooserIntent(Intent... intents) {
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
chooser.putExtra(Intent.EXTRA_TITLE, "選擇圖片來源");
return chooser;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mywebview.canGoBack()) {
mywebview.goBack();// 返回前一個頁面
return true;
} else {
finish();
}
return super.onKeyDown(keyCode, event);
}
}
webview呼叫HTTPS連結時無法載入圖片,需要加入以下方法:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webview.getSettings() .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
相關推薦
WebView呼叫拍照與相簿(HTTPS無法顯示問題)
以前在使用webview的時候,H5裡面並沒有拍照與相簿的功能,這次遇到了,記錄一下。 android原生瀏覽器並不支援H5呼叫拍照與相簿,所以在webview使用中,需要使用Android的程式碼去呼叫。 程式碼如下: public class MainActivit
Unity與安卓互動之拍照與相簿
參考連結: 準備環境,我的是unity4.7.1 和 AndroidStudio 首先匯入unity目錄的 classes.jar 包到 AndroidStudio的 libs 目錄下 然後設定 build.gradle 刪除activity_
webview 呼叫照相機,相簿上傳檔案
private static final int REQ_CAMERA = FILECHOOSER_RESULTCODE+1; private static final int REQ_CHOOSE = REQ_CAMERA+1; ValueCallback<Uri[]> mFilePat
office2007 word 圖片與mathtype公式無法顯示的問題
http://hi.baidu.com/jqghfvyxgmbchuq/item/1a2ce92e1dc7273a94f62bbf office2007 word 裡面的圖片突然不能顯示了,只有一個白白的框,但是調整大小的時候能看到原圖在閃爍,到網上查了一下,解決方法如
android webview設定縮放按鈕時候無法顯示問題
//支援縮放 webSettings.setSupportZoom(true); // 縮放按鈕 webSettings.setBuiltInZoomControls(true); 在webview中,設定了顯示縮放按鈕(放大縮小),但是發現有的頁面能顯示,有的頁面
圖片儲存到本地在相簿中無法顯示問題
我們在儲存成功後,還要發一個系統廣播通知手機有圖片更新,廣播如下: Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(file); intent
Android開發之呼叫相機拍照與本地相簿選擇圖片
使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可
【Discuz】ucenter通訊失敗與Discuz的頭像無法顯示
key 信息 賬號登錄 ip地址 應用 樣式 退出 ack 人的 假設是Discuz論壇的一些小樣式圖片。僅僅須要升級一下Discuz論壇的論壇或者,直接把整個網站的css的首域名替換一下。比方將127.0.0.1:8080/..開頭的東西全改成127.0.0.1:
Webview呼叫Android相機,錄影,相簿遇到的坑
轉自:https://blog.csdn.net/a_running_wolf/article/details/77983739 今天拿到一個h5頁面,發現需要呼叫到Android系統相簿,錄影,相機的時候,任你怎麼點選上傳圖片,死活沒有反應,奇怪的是,使用瀏覽器和微信直接載入
ionic3 實現拍照與從相簿選擇功能
參考了很多網上的資料,但是每個人遇到的問題都不一樣,我這裡出現的問題,可能是node版本,還有外掛版本之類的問題,問題以及解決方式可以看這個圖。 一、外掛依賴引入 (1)配置相機 在控制行輸入命令: ionic cordova plugin add cordova-
angularjs手機webapp 利用input拍照,相簿選擇、縮圖顯示 上傳圖片(一)
執行後的截圖: html程式碼 <ul class="list_img"> <li ng-repeat="imageSrc in imgshows track by $index"> <img n
Android的WebView呼叫本地相簿
首先要知道android本身的WebView是並不支援呼叫手機檔案並上傳的,其次WebView的核心在android每次更新的時候都是不太一樣的,也是夠坑爹的;不過需求又不能改,H5需要呼叫系統相簿,還好最後還是找到方法解決了,就是要重寫裡面的一個方法,不過這種情況也是在5.0之前有效,5.
android 手機拍照、相簿選擇照片並顯示
關鍵程式碼: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn1; private Uri imageUri;
Android中scrollview巢狀webview後導致網頁載入成功但無法顯示
今天同事提出了一個bug,關於h5頁面無法顯示為空白頁,因為這塊的程式碼不是我寫的,之前同事寫的,所以我就看了一下程式碼,初看沒什麼問題,因為感覺這沒什麼難度,就
Andrid 呼叫相機拍照,相簿,圖片裁剪
Andrid 呼叫相機拍照,相簿,圖片裁剪 新增讀寫許可權 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission a
Android整合html中呼叫拍照功能拍照後無法上傳問題分析解決
最近在做專案的時候遇到一個很詭異的問題,後來找到原因以後,發現原因很簡單,修改很easy,不多大多數情況下我們都容易忽略。 問題描述:使用Android手機中的html介面呼叫拍照功能(未使用第三方外掛),發現照片無法傳上去,但是使用從相簿選擇功能,就可以正常上傳照片。後來我把上次通過拍照儲
android點選極光推送的通知跳轉到webview頁面顯示網頁,webview返回錯誤程式碼-6,無法連線伺服器
這個bug比較坑,在webview中無法開啟,將地址複製到電腦瀏覽器中能正常開啟,網上搜索到的說無法連線伺服器是沒有加"http://",可我是加了的,我加了還是打不開。某法了,去看看IP地址,終於讓我找到問題了。 後臺伺服器我搭建的是本地的,請求地址也是後臺返回來的,結果
WebView中拍照或從相簿上傳圖片
WebView 上傳圖片, 想必很多人都碰到過這樣的場景. 而且 WebView 在4.4前後的區別非常大, 比如對URL跳轉的格式, 對JS的注入宣告等等, 4.4以後的WebView 已經是chromium核心, 有多強大就無需我贅述. 說這些, 其實也是
獲取本地拍照和相簿顯示到ImageView
先來看看效果 xml佈局程式碼 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm
h5呼叫相機、相簿、攝像頭拍照、錄影並壓縮預覽
1、使用h5中的input標籤 <!--相機--> <input id="fileBtn" type="file" onchange="upload('#fileBtn');" accept="image/*" capture='camera' styl