1. 程式人生 > >webview 呼叫照相機,相簿上傳檔案

webview 呼叫照相機,相簿上傳檔案

  private static final int REQ_CAMERA = FILECHOOSER_RESULTCODE+1;
  private static final int REQ_CHOOSE = REQ_CAMERA+1;
  ValueCallback<Uri[]> mFilePathCallback;
  private class MyWebChromeClient extends WebChromeClient {

     public boolean onShowFileChooser(
           WebView webView, ValueCallback<Uri[]> filePathCallback,
           WebChromeClient.FileChooserParams fileChooserParams) {
        if (mFilePathCallback != null) return true;
        mFilePathCallback = filePathCallback;
        selectImage();
        return true;
     }
     // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {  
              if (mUploadMessage != null) return;
              mUploadMessage = uploadMsg;   
              selectImage();
//              Intent i = new Intent(Intent.ACTION_GET_CONTENT);
//              i.addCategory(Intent.CATEGORY_OPENABLE);
//              i.setType("*/*");
//                  startActivityForResult( Intent.createChooser( i, "File Chooser" ), FILECHOOSER_RESULTCODE );
          }
           // 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);
         }

  }
  
  /**
   * 檢查SD卡是否存在
   * 
   * @return
   */
  public final boolean checkSDcard() {
     boolean flag = Environment.getExternalStorageState().equals(
           Environment.MEDIA_MOUNTED);
     if (!flag) {
        Toast.makeText(this, "請插入手機儲存卡再使用本功能",Toast.LENGTH_SHORT).show();
     }
     return flag;
  }
  String compressPath = "";
  
  protected final void selectImage() {
     if (!checkSDcard())
        return;
     String[] selectPicTypeStr = { "相機","相簿" };
     AlertDialog alertDialog = new AlertDialog.Builder(this)
           .setItems(selectPicTypeStr,
                 new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                   int which) {
                       switch (which) {
                          // 相機拍攝
                          case 0:
                             openCarcme();
                             break;
                          // 手機相簿
                          case 1:
                             chosePic();
                             break;
                          default:
                             break;
                       }
                       compressPath = Environment
                             .getExternalStorageDirectory()
                             .getPath()
                             + "/fuiou_wmp/temp";
                       new File(compressPath).mkdirs();
                       compressPath = compressPath + File.separator
                             + "compress.jpg";
                    }
                 }).setOnCancelListener(new DialogInterface.OnCancelListener() {
              @Override
              public void onCancel(DialogInterface dialogInterface) {
                 if(mFilePathCallback != null){
                    Uri[] uris = new Uri[1];
                    uris[0] = Uri.parse("");
                    mFilePathCallback.onReceiveValue(uris);
                    mFilePathCallback=null;
                 }else {
                    mUploadMessage.onReceiveValue(Uri.parse(""));
                    mUploadMessage=null;
                 }
              }
           }).show();
  }
  
  String imagePaths;
  Uri  cameraUri;
  /**
   * 開啟照相機
   */
  private void openCarcme() {
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

     imagePaths = Environment.getExternalStorageDirectory().getPath()
           + "/fuiou_wmp/temp/"
           + (System.currentTimeMillis() + ".jpg");
     // 必須確保資料夾路徑存在,否則拍照後無法完成回撥
     File vFile = new File(imagePaths);
     if (!vFile.exists()) {
        File vDirPath = vFile.getParentFile();
        vDirPath.mkdirs();
     } else {
        if (vFile.exists()) {
           vFile.delete();
        }
     }
     cameraUri = Uri.fromFile(vFile);
     intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
     startActivityForResult(intent, REQ_CAMERA);
  }

  /**
   * 拍照結束後
   */
  private void afterOpenCamera() {
     File f = new File(imagePaths);
     addImageGallery(f);
  }

  /** 解決拍照後在相簿中找不到的問題 */
  private void addImageGallery(File file) {
     ContentValues values = new ContentValues();
     values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
     values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
     getContentResolver().insert(
           MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  }

  /**
   * 本地相簿選擇圖片
   */
  private void chosePic() {
  //刪除檔案
    // FileUtils.delFile(compressPath);
   /*  Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"
     String IMAGE_UNSPECIFIED = "image/*";
     innerIntent.setType(IMAGE_UNSPECIFIED); // 檢視型別
     Intent wrapperIntent = Intent.createChooser(innerIntent, null);
     startActivityForResult(wrapperIntent, REQ_CHOOSE);*/
     Intent intent  = new Intent(MywebviewTestActivity.this,TukuActivity.class);
     startActivityForResult(intent, REQ_CHOOSE);
  }

  /**
   * 選擇照片後結束
   * 
   * @param data
   */
  private Uri[] afterChosePic(Intent data) {

     // 獲取圖片的路徑:
    // String[] proj = { MediaStore.Images.Media.DATA };
     // 好像是android多媒體資料庫的封裝介面,具體的看Android文件
    // Cursor cursor = managedQuery(data.getData(), proj, null, null, null);
    /* if(cursor == null ){
        Toast.makeText(this, "上傳的圖片僅支援png或jpg格式",Toast.LENGTH_SHORT).show();
        return null;
     }*/
     // 按我個人理解 這個是獲得使用者選擇的圖片的索引值
    // int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
     // 將游標移至開頭 ,這個很重要,不小心很容易引起越界
    // cursor.moveToFirst();
     // 最後根據索引值獲取圖片路徑
  //這個是 吧圖片路徑才分出來
     String Mypath = data.getStringExtra("result");
     String[] Path = Mypath.split("%26");
     Uri[] iMUri=new Uri[Path.length];
   
     for(int i =0;i<Path.length;i++){
    File newFile = FileUtils.compressFile(Path[i],Environment
                      .getExternalStorageDirectory()
                      .getPath()
                      + "/fuiou_wmp/temp" + File.separator+"compress"+i+".jpg");
    
    iMUri[i]=Uri.fromFile(newFile);
     }
     
    // if(path != null && (path.endsWith(".png")||path.endsWith(".PNG")||path.endsWith(".jpg")||path.endsWith(".JPG"))){
   // File newFile=new  File(path);
   //把它做成檔案組
    
        return iMUri;
  }





  /**
   * 返回檔案選擇      
   */
  @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;
   }

     if (null == mUploadMessage && mFilePathCallback == null)
        return;
     Uri uri = null;
     File file=null;
     Uri[] myUris=null;
if(cameraUri!=null){
    file = new File(cameraUri.getPath());
    if(!file.exists()){
        cameraUri = Uri.parse("");
     }
     } 
    
    
     if(requestCode == REQ_CAMERA &&mFilePathCallback != null){
        afterOpenCamera();
        uri = cameraUri;
        Uri[] uris = new Uri[1];
        uris[0] = uri;
        mFilePathCallback.onReceiveValue(uris);
     }else if(requestCode == REQ_CHOOSE && mFilePathCallback != null){
    
    myUris = afterChosePic(intent);
    mFilePathCallback.onReceiveValue(myUris);
     }
     /*if(){
     }else {
        mUploadMessage.onReceiveValue(uri);
     }*/
     mFilePathCallback = null;
     mUploadMessage = null;
     super.onActivityResult(requestCode, resultCode, intent);
  }
  
  public boolean onKeyDown(int keyCode, KeyEvent event) {
     if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {  
        mWebView.goBack();  
        return true;  
     }else{
             finish();
     }
     return super.onKeyDown(keyCode, event);  
     }

相關推薦

webview 呼叫照相機相簿檔案

  private static final int REQ_CAMERA = FILECHOOSER_RESULTCODE+1;  private static final int REQ_CHOOSE = REQ_CAMERA+1;  ValueCallback<Uri[]> mFilePat

Tomcat配置虛擬路徑使檔案與伺服器及工程檔案分離開

原文連結:https://my.oschina.net/pingdy/blog/381001 摘要: 現在一般的專案都可能會涉及檔案的上傳與下載,那如何管理這些檔案呢?做法各有千秋!今天我也分享下我是怎麼去管理這些檔案的!當然了,這樣的方式只適用於檔案量小的情況下!如果檔案數量非

阿里雲 javascript檔案(圖片、視訊、壓縮包等檔案)到 物件儲存 OSS 返回檔案、圖片、音訊、視訊等URL路徑

目的:前端上傳檔案(圖片、視訊、音訊等)到阿里雲伺服器裡面,並且獲得上傳檔案的URL路徑 前提:首先要買一個阿里雲伺服器,自己百度不會; 第一步:登入阿里雲賬號,點選管理控制檯-->物件儲存 OSS 第二步:新建儲存空間(圖一、圖二) (圖一) (圖二

IntelliJ IDEA實現遠端連線linux檔案到linux伺服器(SSH會話功能和SFTP功能)

注意: eclipse的SSH會話功能和SFTP功能這裡不會說 點選以下連結可檢視   eclipse的SSH會話功能和SFTP功能 而IntelliJ IDEA(以下簡稱為IDEA)這麼強大的開發工具自然也有該功能,這篇部落格就介紹一下IDEA的SSH會話功能

ajax 檔案post檔案ajax 提交 JSON 格式的資料

ajax簡介 前後臺做資料互動 前後端做資料互動的方式(三種):     (1)瀏覽器視窗輸入地址(get的方式)(2)form表單提交資料(3)ajax提交資料 特點 特點:  (1)非同步       非同步與同步的區別:同步是請求發過去,要等著迴應;非同步不

通過okhttp3方式呼叫另一個專案檔案

OkHttp3檔案上傳介面   專案中用到需要將檔案上傳到另一專案B上,專案B提供了一個檔案上傳的介面。就用到了在後臺介面中傳送post請求來將檔案傳過去。可以使用okhttp3的方式,非常簡單。 1、加依賴   首先專案加如下依賴: <dependency>

tp5呼叫阿里雲oss檔案

推薦使用composer方式 composer方式安裝SDK的步驟如下: 在專案的根目錄執行composer require aliyuncs/oss-sdk-php,或者在composer.j

在SpringBoot的環境下檔案的功能結果沒有獲取到檔案的問題(ServletFileUpload中getItemIterator(request)為空)

在SpringBoot的環境下,寫上傳檔案的功能,結果沒有獲取到檔案的問題: 情況一: 使用Apache Commons FileUpload 元件上傳檔案時總是返回null,multipart/form-data型別檔案的接收。 <!DOCTYPE html>

abap中ftp檔案demo

*&---------------------------------------------------------------------**&      Form  frm_trans_file_to_ftp*&----------------

Vue.js下載檔案及判斷檔案型別獲取檔案大小

目錄 下載檔案 方法一  方法二 方法三 1.程式碼 1.程式碼 1.程式碼 下載檔案 所用的瀏覽器:Google Chrome 方法一 功能:點選匯出按鈕,提交請求,下載excel檔案; 1.跟後端

在雲伺服器(Windows系統)端建立ftp服務端檔案

1.開始—》搜尋“mstsc”—>如下圖 之後有要求輸入使用者名稱和密碼,注意是使用者名稱預設是administrator,密碼是雲伺服器的密碼(包括大小寫和字元的那個密碼) 2.連

批處理中呼叫 WinSCP 命令列檔案

@echo off setlocal enabledelayedexpansion set ID=AY47C010 REM 設定檔案的路徑 set SHELL_DIR=H:\IDE\eclipse\workspace\XXXX\shell set CLASSES_DIR=H

【全網首創】修改 Ext.ux.UploadDialog.Dialog 原始碼支援多選新增檔案批量檔案

  公司老框架的一個頁面需要用到檔案上傳,本以為修改一個配置引數即可解決,百度一番發現都在說這個第三方外掛不支援檔案多選功能,還有各種各樣缺點,暫且不討論這些吧。先完成領導安排下來的任務。   任務一:支援多選新增檔案   任務二:支援批量新增檔案   我們先來說第二個任務吧,第二個任務相比較容易些,經過半天

android使用webview檔案(支援相簿和拍照)支援最高6.0安卓系統(改進版)

首先學習 http://blog.csdn.net/woshinia/article/details/19030437 對input file的支援1.注意 mUploadMessage.onReceiveValue(Uri.parse("")); 必須得到呼叫,無論使用者是否選了圖,否則會出現再點選不響應

Android WebView嵌入H5之file頭像檔案適配所有版本

 最近公司需要開發新的專案,為了節省時間成本,要求整體嵌入H5介面。對,沒看錯是整體嵌入,心中一萬隻草泥馬奔騰,沒辦法大佬就是大佬,還是的照做。 今天來說說h5上傳頭像的問題吧。網上有很多的解決方案,開始我覺得好像很簡單,都有成功案例,等把程式碼copy下來,發現並不能執

android使用webview檔案(支援相簿和拍照)

最近需要做一個專案,需要呼叫伺服器段的一些網頁來選擇檔案,剛開始還挺糾結的,不知從何下手,網上大致預覽了大神們走過的路,他們傳統的方式都是使用一下程式碼: publicvoid openFileChooser(ValueCallback<Uri> uploa

關於微信WEBVIEW網頁無法檔案的問題即是INPUT FILE不支援的問題

絕大部分人都遇到了微信內建瀏覽器中input file元素點選沒反應的情況,這其實並不是微信的錯,微信沒有做任何事情來限制你。 這個問題只存在於Android4.4或以上版本的系統,4.4以下是沒問題的,IOS當然也是沒有任何問題。所以這是google的錯。從Andro

springMVC檔案MultipartHttpServletRequest、MultipartFile進行檔案

這裡使用apache的開源jar包完成上傳功能,使用jar包分別是:common-fileupload.jar和common-io.jar  先編寫上傳檔案幫助類,如果需要區分檔案型別,可以將檔案字尾擷取進行判斷; springmvc-mvc.xml配置,這裡主要配置spri

Spring Boot檔案出錯Required request part fileis not present

先上程式碼: @RestController @RequestMapping("/file") //@PreAuthorize(“hasAuthority(ROLE_USER)”) public class FileController { /** * 提取檔案上傳的公用程式碼

ajax+php檔案原始碼可正常執行

完整的jquery Ajax+php上傳檔案原始碼,可直接放到網站目錄下執行 index.html <html> <head> <title>TEST</title> <meta charset="UTF-8"&g