The solution of html <input type = "file "> in webview not work

来源:互联网 发布:建表外键sql 编辑:程序博客网 时间:2024/06/05 09:58

Refer: https://github.com/mgks/Os-FileUp/blob/master/app/src/main/java/com/inf/os/fileup/MainActivity.java

package com.inf.os.fileup;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.support.annotation.NonNull;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.webkit.ValueCallback;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class MainActivity extends AppCompatActivity{    WebView webView;    private static final String TAG = MainActivity.class.getSimpleName();    private String mCM;    private ValueCallback<Uri> mUM;    private ValueCallback<Uri[]> mUMA;    private final static int FCR=1;    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent intent){        super.onActivityResult(requestCode, resultCode, intent);        if(Build.VERSION.SDK_INT >= 21){            Uri[] results = null;            //Check if response is positive            if(resultCode== Activity.RESULT_OK){                if(requestCode == FCR){                    if(null == mUMA){                        return;                    }                    if(intent == null){                        //Capture Photo if no image available                        if(mCM != null){                            results = new Uri[]{Uri.parse(mCM)};                        }                    }else{                        String dataString = intent.getDataString();                        if(dataString != null){                            results = new Uri[]{Uri.parse(dataString)};                        }                    }                }            }            mUMA.onReceiveValue(results);            mUMA = null;        }else{            if(requestCode == FCR){                if(null == mUM) return;                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();                mUM.onReceiveValue(result);                mUM = null;            }        }    }    @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        webView = (WebView) findViewById(R.id.ifView);        assert webView != null;        WebSettings webSettings = webView.getSettings();        webSettings.setJavaScriptEnabled(true);        webSettings.setAllowFileAccess(true);        if(Build.VERSION.SDK_INT >= 21){            webSettings.setMixedContentMode(0);            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);        }else if(Build.VERSION.SDK_INT >= 19){            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);        }else if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19){            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);        }        webView.setWebViewClient(new Callback());        webView.loadUrl("https://infeeds.com/");        webView.setWebChromeClient(new WebChromeClient(){            //For Android 3.0+            public void openFileChooser(ValueCallback<Uri> uploadMsg){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FCR);            }            // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this            public void openFileChooser(ValueCallback uploadMsg, String acceptType){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(                        Intent.createChooser(i, "File Browser"),                        FCR);            }            //For Android 4.1+            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){                mUM = uploadMsg;                Intent i = new Intent(Intent.ACTION_GET_CONTENT);                i.addCategory(Intent.CATEGORY_OPENABLE);                i.setType("*/*");                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR);            }            //For Android 5.0+            public boolean onShowFileChooser(                    WebView webView, ValueCallback<Uri[]> filePathCallback,                    WebChromeClient.FileChooserParams fileChooserParams){                if(mUMA != null){                    mUMA.onReceiveValue(null);                }                mUMA = filePathCallback;                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                if(takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null){                    File photoFile = null;                    try{                        photoFile = createImageFile();                        takePictureIntent.putExtra("PhotoPath", mCM);                    }catch(IOException ex){                        Log.e(TAG, "Image file creation failed", ex);                    }                    if(photoFile != null){                        mCM = "file:" + photoFile.getAbsolutePath();                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));                    }else{                        takePictureIntent = null;                    }                }                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);                contentSelectionIntent.setType("*/*");                Intent[] intentArray;                if(takePictureIntent != null){                    intentArray = new Intent[]{takePictureIntent};                }else{                    intentArray = new Intent[0];                }                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);                chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);                startActivityForResult(chooserIntent, FCR);                return true;            }        });    }    public class Callback extends WebViewClient{        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){            Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show();        }    }    // Create an image file    private File createImageFile() throws IOException{        @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());        String imageFileName = "img_"+timeStamp+"_";        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);        return File.createTempFile(imageFileName,".jpg",storageDir);    }    @Override    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){        if(event.getAction() == KeyEvent.ACTION_DOWN){            switch(keyCode){                case KeyEvent.KEYCODE_BACK:                    if(webView.canGoBack()){                        webView.goBack();                    }else{                        finish();                    }                    return true;            }        }        return super.onKeyDown(keyCode, event);    }    @Override    public void onConfigurationChanged(Configuration newConfig){        super.onConfigurationChanged(newConfig);    }}
1 0
原创粉丝点击