1. 程式人生 > >WebView呼叫拍照與相簿(HTTPS無法顯示問題)

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