1. 程式人生 > >WebView基於H5的上傳和和下載

WebView基於H5的上傳和和下載

/**選擇後,回傳值*/
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (mUploadMessage == null && mUploadCallbackAboveL == null) {
            return;
        }
        Uri uri = null;
        switch (requestCode) {
        case RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP:
            uri = afterChosePic(data);
            if (mUploadMessage != null) {
                mUploadMessage.onReceiveValue(uri);
                mUploadMessage = null;
            }
            break;
        case RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP:
            try {
                uri = afterChosePic(data);
                if (uri == null) {
                    mUploadCallbackAboveL.onReceiveValue(new Uri[] { });
                    mUploadCallbackAboveL = null;
                    break;
                }
                if (mUploadCallbackAboveL != null && uri != null) {
                    mUploadCallbackAboveL.onReceiveValue(new Uri[] { uri });
                    mUploadCallbackAboveL = null;
                }
            } catch (Exception e) {
                mUploadCallbackAboveL = null;
                e.printStackTrace();
            }
            break;
        }
    }
**
下面把完整的程式碼貼上來:
** 
WebViewActivity.java
package com.lwd.webviewupimg;

import java.io.File;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore.Images.ImageColumns;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * @author lwd
 * @create 2016年8月17日
 */
@SuppressLint("SetJavaScriptEnabled")
public class WebViewActivity extends Activity{
    private WebView webview;
    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mUploadCallbackAboveL;
    private final int RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP = 1;
    private final int RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP = 2;
    private String url = "";//這裡新增含有圖片上傳功能的H5頁面訪問地址即可。
    String compressPath = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        initData();
    }

    public void initData() {
        webview = (WebView) findViewById(R.id.webview);
        initWebView();
        webview.loadUrl(url);
    }
    @SuppressWarnings("deprecation")
    private void initWebView(){
        webview.setScrollBarStyle(View.GONE);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webview.getSettings().setDomStorageEnabled(false);
        webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        webview.getSettings().setPluginState(WebSettings.PluginState.ON);
        webview.getSettings().setAllowFileAccess(true);
        webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
        webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        webview.getSettings().setUseWideViewPort(true);
        webview.getSettings().setLoadWithOverviewMode(true);
        webview.getSettings().setAllowContentAccess(true);
        webview.requestFocus();
        webview.setWebViewClient(new WebClient());
        webview.setWebChromeClient(new MyWebChromeClient());
    }
    /**選擇後,回傳值*/
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (mUploadMessage == null && mUploadCallbackAboveL == null) {
            return;
        }
        Uri uri = null;
        switch (requestCode) {
        case RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP:
            uri = afterChosePic(data);
            if (mUploadMessage != null) {
                mUploadMessage.onReceiveValue(uri);
                mUploadMessage = null;
            }
            break;
        case RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP:
            try {
                uri = afterChosePic(data);
                if (uri == null) {
                    mUploadCallbackAboveL.onReceiveValue(new Uri[] { });
                    mUploadCallbackAboveL = null;
                    break;
                }
                if (mUploadCallbackAboveL != null && uri != null) {
                    mUploadCallbackAboveL.onReceiveValue(new Uri[] { uri });
                    mUploadCallbackAboveL = null;
                }
            } catch (Exception e) {
                mUploadCallbackAboveL = null;
                e.printStackTrace();
            }
            break;
        }
    }
    /**
     * 選擇照片後結束
     * @param data
     */
    private Uri afterChosePic(Intent data) {
        if (data == null) {
            return null;
        }
        String path = getRealFilePath(data.getData());
        String[] names = path.split("\\.");
        String endName = null;
        if (names != null) {
            endName = names[names.length - 1];
        }
        if (endName != null) {
            compressPath = compressPath.split("\\.")[0] + "." + endName;
        }
        File newFile;
        try {
            newFile = FileUtils.compressFile(path, compressPath);
        } catch (Exception e) {
            newFile = null;
        }
        return Uri.fromFile(newFile);
    }
    /**
     * 根據Uri獲取圖片檔案的絕對路徑
     */
    public String getRealFilePath(final Uri uri) {
        if (null == uri) {
            return null;
        }
        final String scheme = uri.getScheme();
        String data = null;
        if (scheme == null) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = getContentResolver().query(uri,
                    new String[] { ImageColumns.DATA }, null, null, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    int index = cursor.getColumnIndexOrThrow(ImageColumns.DATA);
                    if (index > -1) {
                        data = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        return data;
    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        if(webview.canGoBack()){
            webview.goBack();
        }else{
            finish();
        }
    }
    private class WebClient extends WebViewClient {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    /**開啟相簿,同時處理圖片(專案業務需要統一命名)*/
    private void selectImage(int resultCode) {
        compressPath = Environment.getExternalStorageDirectory().getPath() + "/QWB/temp";
        File file = new File(compressPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        compressPath = compressPath + File.separator + "compress.png";
        File image = new File(compressPath);
        if (image.exists()) {
            image.delete();
        }
        Intent intent = new Intent(
                Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, resultCode);

    }
    /**
     * 內部類
     */
    class MyWebChromeClient extends WebChromeClient {
        //openFileChooser(隱藏方法)僅適用android5.0以下的環境,android5.0及以上使用onShowFileChooser

        // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg,
                String acceptType) {
            if (mUploadMessage != null)
                return;
            mUploadMessage = uploadMsg;
            selectImage(RESULT_CODE_PICK_FROM_ALBUM_BELLOW_LOLLILOP);
        }

        // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            openFileChooser(uploadMsg, "");
        }

        // For Android > 4.1.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg,
                String acceptType, String capture) {
            openFileChooser(uploadMsg, acceptType);
        }

        // For Android 5.0+
        public boolean onShowFileChooser(WebView webView,
                ValueCallback<Uri[]> filePathCallback,
                FileChooserParams fileChooserParams) {
            mUploadCallbackAboveL = filePathCallback;
            selectImage(RESULT_CODE_PICK_FROM_ALBUM_ABOVE_LOLLILOP);
            return true;
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
        }
    }
}
  ● 
package com.lwd.webviewupimg;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.text.TextUtils;
import android.util.Log;

public class FileUtils {

    /**
     * 把圖片壓縮到200K
     * 
     * @param oldpath
     *            壓縮前的圖片路徑
     * @param newPath
     *            壓縮後的圖片路徑
     * @return
     */
    public static File compressFile(String oldpath, String newPath) {
        Bitmap compressBitmap = FileUtils.decodeFile(oldpath);
        Bitmap newBitmap = ratingImage(oldpath, compressBitmap);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        newBitmap.compress(CompressFormat.PNG, 100, os);
        byte[] bytes = os.toByteArray();

        File file = null ;
        try {
            file = FileUtils.getFileFromBytes(bytes, newPath);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(newBitmap != null ){
                if(!newBitmap.isRecycled()){
                    newBitmap.recycle();
                }
                newBitmap  = null;
            }
            if(compressBitmap != null ){
                if(!compressBitmap.isRecycled()){
                    compressBitmap.recycle();
                }
                compressBitmap  = null;
            }
        }
        return file;
    }

    private static Bitmap ratingImage(String filePath,Bitmap bitmap){
        int degree = readPictureDegree(filePath);
        return rotaingImageView(degree, bitmap);
    }

    /**
     *  旋轉圖片
     * @param angle
     * @param bitmap
     * @return Bitmap
     */
    public static Bitmap rotaingImageView(int angle , Bitmap bitmap) {
        //旋轉圖片 動作
        Matrix matrix = new Matrix();;
        matrix.postRotate(angle);
        System.out.println("angle2=" + angle);
        // 建立新的圖片
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        return resizedBitmap;
    }

    /**
     * 讀取圖片屬性:旋轉的角度
     * @param path 圖片絕對路徑
     * @return degree旋轉的角度
     */
    public static int readPictureDegree(String path) {
        int degree  = 0;
        try {
                ExifInterface exifInterface = new ExifInterface(path);
                int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                        degree = 90;
                        break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                        degree = 180;
                        break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                        degree = 270;
                        break;
                }
        } catch (IOException e) {
                e.printStackTrace();
        }
        return degree;
    }

    /**
     * 把位元組陣列儲存為一個檔案
     * 
     * @param b
     * @param outputFile
     * @return
     */
    public static File getFileFromBytes(byte[] b, String outputFile) {
        File ret = null;
        BufferedOutputStream stream = null;
        try {
            ret = new File(outputFile);
            FileOutputStream fstream = new FileOutputStream(ret);
            stream = new BufferedOutputStream(fstream);
            stream.write(b);
        } catch (Exception e) {
            // log.error("helper:get file from byte process error!");
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    // log.error("helper:get file from byte process error!");
                    e.printStackTrace();
                }
            }
        }
        return ret;
    }

    /**
     * 圖片壓縮
     * 
     * @param fPath
     * @return
     */
    public static Bitmap decodeFile(String fPath) {
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;
        opts.inDither = false; // Disable Dithering mode
        opts.inPurgeable = true; // Tell to gc that whether it needs free
        opts.inInputShareable = true; // Which kind of reference will be used to
        BitmapFactory.decodeFile(fPath, opts);
        final int REQUIRED_SIZE = 200;
        int scale = 1;
        if (opts.outHeight > REQUIRED_SIZE || opts.outWidth > REQUIRED_SIZE) {
            final int heightRatio = Math.round((float) opts.outHeight
                    / (float) REQUIRED_SIZE);
            final int widthRatio = Math.round((float) opts.outWidth
                    / (float) REQUIRED_SIZE);
            scale = heightRatio < widthRatio ? heightRatio : widthRatio;//
        }
        Log.i("scale", "scal ="+ scale);
        opts.inJustDecodeBounds = false;
        opts.inSampleSize = scale;
        Bitmap bm = BitmapFactory.decodeFile(fPath, opts).copy(Config.ARGB_8888, false);
        return bm;
    }



    /**
     * 建立目錄
     * @param path
     */
    public static void setMkdir(String path)
    {
        File file = new File(path);
        if(!file.exists())
        {
            file.mkdirs();
            Log.e("file", "目錄不存在  建立目錄    ");
        }else{
            Log.e("file", "目錄存在");
        }
    }

    /**
     * 獲取目錄名稱
     * @param url
     * @return FileName
     */
    public static String getFileName(String url)
    {
        int lastIndexStart = url.lastIndexOf("/");
        if(lastIndexStart!=-1)
        {
            return url.substring(lastIndexStart+1, url.length());
        }else{
            return null;
        }
    }

    /**
     * 刪除該目錄下的檔案
     * 
     * @param path
     */
    public static void delFile(String path) {
        if (!TextUtils.isEmpty(path)) {
            File file = new File(path);
            if (file.exists()) {
                file.delete();
            }
        }
    }
}

上面介紹了webView的上傳,下面來介紹一下WebView的下載功能,
WebView控制呼叫相應的WEB頁面進行展示。當碰到頁面有下載連結的時候,點選上去是一點反應都沒有的。原來是因為WebView預設沒有開啟檔案下載的功能,如果要實現檔案下載的功能,需要設定WebView的DownloadListener,通過實現自己的DownloadListener來實現檔案的下載。具體操作如下: 

1、設定WebView的DownloadListener: 
    webView.setDownloadListener(new MyWebViewDownLoadListener()); 

2、實現MyWebViewDownLoadListener這個類,具體可以如下這樣:  
private class MyWebViewDownLoadListener implements DownloadListener{   
  
        @Override  
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,   
                                    long contentLength) {              
            Log.i("tag", "url="+url);              
            Log.i("tag", "userAgent="+userAgent);   
            Log.i("tag", "contentDisposition="+contentDisposition);            
            Log.i("tag", "mimetype="+mimetype);   
            Log.i("tag", "contentLength="+contentLength);   
            Uri uri = Uri.parse(url);   
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);   
            startActivity(intent);              
        }   
    }  

這只是呼叫系統中已經內建的瀏覽器進行下載,還沒有WebView本身進行的檔案下載,不過,這也基本上滿足我們的應用場景了。 

我在專案中的運用 
專案要求這樣: 
1,需要使用WebView載入一個網頁; 
2,網頁中有檔案下載的連結,點選後需要下載檔案到SDcard; 
3,然後自動開啟檔案; 
下面是具體解決辦法 
第一步,對WebView進行一系列設定。 

相關推薦

webview支援H5圖片

今天H5妹子突然問我是不是遮蔽了他選擇圖片的控制元件,我一臉懵逼,一大堆黑人問號??? 上網找了半天資料 原來webview還需要做下處理 mWebView.setWebChromeClient(new WebChromeClient() {

WebView基於H5下載

/**選擇後,回傳值*/ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,

專案下載專案

若向上傳下載專案必須按照SVN外掛       搭建完成後就可以上傳下載專案 上傳專案 選中目標專案右鍵點選team-->share project 若第一次提交需要建立新的資源位子 否則使用已有的

django 基於form表單檔案基於ajax檔案

一、基於form表單上傳檔案 1、html裡是有一個input type="file" 和 ‘submit’的標籤 2、vies.py def fileupload(request): if request.method == 'POST': print(request.P

django 基於form表單文件基於ajax文件

.py ons strong code .ajax lin con html $.ajax 一、基於form表單上傳文件 1、html裏是有一個input type="file" 和 ‘submit’的標簽 2、vies.py def fileupload(request

基於springMVC+AJAX+bootstraptable實現檔案客戶端分頁

1 首先看一下上傳表格程式碼,主要程式碼如下: <form method="post" enctype="multipart/form-data" id="orderform"> <div class="col-md-6 col-sm-12"&

Java ftp 檔案下載檔案

今天同事問我一個ftp 上傳檔案和下載檔案功能應該怎麼做,當時有點懵逼,畢竟我也是第一次,然後裝了個逼,在網上找了一段程式碼發給同事,叫他除錯一下。結果悲劇了,執行不通過。(裝逼失敗) 我找的文章連結:http://blog.csdn.net/yucaifu1989/art

圖片 壓縮 mongodb下載

// 獲得SpringBoot提供的mongodb的GridFS物件 @Autowired private GridFsTemplate gridFsTemplate; public ServiceResult<FileInfoAO> compressUplo

在spring boot下如何通過rest 介面 來檔案 下載檔案 到 hadoop hdfs

本文將用程式碼來演示在spring boot裡面,用hadoop client,通過restful API來上傳檔案 和下載檔案 到 hadoop hdfs。 裡面有一些程式碼依賴坑,注意繞行。 前提: 如果你的程式碼在windows上執行,去連線linux上的hado

檔案下載pdf還有tp3掃二維碼下載and輸出text檔案給使用者

思路:後臺點選上傳,然後上傳到指定位置,然後取得這個字串寫到資料庫 <!--後臺那邊上傳檔案的標籤程式碼--> <form id="upload-form" action=

H5 移動端圖片 視訊 頁面顯示縮圖

這是我第一次寫部落格,想要分享一下程式設計經驗,因為我也算是一個菜鳥而已,在程式設計過程中,很多問題 都是通過百度,通過CSDN裡面的各位大神分享的經驗,才得以解決的,所以我也是本著造福他人,也完善自己的意願,開始寫寫部落格,分享一下程式設計中遇到的問題及解決方法。好,廢話不

springboot專案實現檔案的顯示下載

檔案上傳:HTML上傳頁面程式碼:<input type="file" class="form-control" name="file">submit提交到controller,controller中的程式碼:@RequestMapping(value = "/u

struts3.0的改進struts2--下載

package action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.struts2.ServletActionContext; impor

利用sftp進行、單個下載、批量下載刪除

 最近公司讓用SFTP用來和遠端進行互動,學習了;一段時間sftp,現在將程式碼乾貨獻上,希望對大家能夠有所幫助: 1. 在src/com/zkr/sftp(建議建立在src下)下建立sftp.properties檔案:                sftp.host=

Linux檔案下載檔案命令列方式

在Linux主機上,安裝上傳下載工具包rz及sz 只需要安裝下面這個包即可,執行下面的安裝命令 yum install -y lrzsz 上傳 在Linux命令列下輸入rz, rz 輸入rz命令後,會彈出對話方塊,選擇你要上傳的檔案,

linux 檔案下載檔案命令;centos通過Xshell檔案至linux伺服器以及下載檔案到windows本地

上傳檔案我們經常會選擇在伺服器搭建ftp,用來實現檔案的上傳和下載,同時,我們也應該知道用xshell也可實現檔案的上傳下載,做筆記以備忘。 1,執行yum  install lrzsz 安裝lrzsz工具包,已安裝的跳過 2,安裝完會提示你是否已完成,輸入y,回車

Hadoop檔案下載檔案時候出現的問題

在Hadoop做上傳下載操作的時候,上傳的時候會出現一個超時的異常,在下載的時候回多出來crc的檔案 /**

基於SpringBoot從零構建部落格網站 - 設計可擴充套件模組開發修改頭像密碼功能

上傳模組在web開發中是很常見的功能也是很重要的功能,在web應用中需要上傳的可以是圖片、pdf、壓縮包等其它型別的檔案,同時對於圖片可能需要回顯,對於其它檔案要能夠支援下載等。在守望部落格系統中對於上傳模組進行統一管理,同時對於上傳不同的型別檔案,留有自定義實現機制的介面,也即可擴充套件。 基於上傳模組機制

C# 調用微信接口素材發送圖文消息

context puts out odin app bin utf8 light while using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;us

ajax之---圖片預覽

上傳圖片 TE obj ret upload play targe review sta views.py def upload_img(request): nid=str(uuid.uuid4()) ret={‘status‘:True,‘data‘:None