webview開發中使用onShowFileChooser實現web頁開啟照相機或者圖片瀏覽
阿新 • • 發佈:2019-01-02
web頁面中input type="file"的事件監聽在webview中使用onShowFileChooser實現,程式碼如下:
import android.app.Activity; import android.app.ProgressDialog; import android.content.ClipData; import android.content.Intent; import android.graphics.Bitmap;import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; importandroid.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extendsActivity { private static final int INPUT_FILE_REQUEST_CODE = 1; private static final String TAG = MainActivity.class.getSimpleName(); private WebView webView; private WebSettings webSettings; private ValueCallback<Uri[]> mUploadMessage; private String mCameraPhotoPath = null; private long size = 0; @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != INPUT_FILE_REQUEST_CODE || mUploadMessage == null) { super.onActivityResult(requestCode, resultCode, data); return; } try { String file_path = mCameraPhotoPath.replace("file:",""); File file = new File(file_path); size = file.length(); }catch (Exception e){ Log.e("Error!", "Error while opening image file" + e.getLocalizedMessage()); } if (data != null || mCameraPhotoPath != null) { Integer count = 1; ClipData images = null; try { images = data.getClipData(); }catch (Exception e) { Log.e("Error!", e.getLocalizedMessage()); } if (images == null && data != null && data.getDataString() != null) { count = data.getDataString().length(); } else if (images != null) { count = images.getItemCount(); } Uri[] results = new Uri[count]; // Check that the response is a good one if (resultCode == Activity.RESULT_OK) { if (size != 0) { // If there is not data, then we may have taken a photo if (mCameraPhotoPath != null) { results = new Uri[]{Uri.parse(mCameraPhotoPath)}; } } else if (data.getClipData() == null) { results = new Uri[]{Uri.parse(data.getDataString())}; } else { for (int i = 0; i < images.getItemCount(); i++) { results[i] = images.getItemAt(i).getUri(); } } } mUploadMessage.onReceiveValue(results); mUploadMessage = null; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webView); webSettings = webView.getSettings(); webSettings.setAppCacheEnabled(true); webSettings.setCacheMode(webSettings.LOAD_CACHE_ELSE_NETWORK); webSettings.setJavaScriptEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setAllowFileAccess(true); webView.setWebViewClient(new PQClient()); webView.setWebChromeClient(new PQChromeClient()); //if SDK version is greater of 19 then activate hardware acceleration otherwise activate software acceleration 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.loadUrl("http://10.194.12.80:8088/FAI/SMTvnp.aspx"); //https://en.imgbb.com/ } private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File imageFile = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return imageFile; } public class PQChromeClient extends WebChromeClient { // For Android 5.0+ public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) { // Double check that we don't have any existing callbacks if (mUploadMessage != null) { mUploadMessage.onReceiveValue(null); } mUploadMessage = filePath; Log.e("FileCooserParams => ", filePath.toString()); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // Create the File where the photo should go File photoFile = null; try { photoFile = createImageFile(); takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); } catch (IOException ex) { // Error occurred while creating the File Log.e(TAG, "Unable to create Image File", ex); } // Continue only if the File was successfully created if (photoFile != null) { mCameraPhotoPath = "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.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); contentSelectionIntent.setType("image/*"); Intent[] intentArray; if (takePictureIntent != null) { intentArray = new Intent[]{takePictureIntent}; } else { intentArray = new Intent[2]; } 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(Intent.createChooser(chooserIntent, "Select images"), 1); return true; } } public boolean onKeyDown(int keyCode, KeyEvent event) { // Check if the key event was the Back button and if there's history if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } // If it wasn't the Back key or there's no web page history, bubble up to the default // system behavior (probably exit the activity) return super.onKeyDown(keyCode, event); } public class PQClient extends WebViewClient { ProgressDialog progressDialog; public boolean shouldOverrideUrlLoading(WebView view, String url) { // If url contains mailto link then open Mail Intent if (url.contains("mailto:")) { // Could be cleverer and use a regex //Open links in new browser view.getContext().startActivity( new Intent(Intent.ACTION_VIEW, Uri.parse(url))); // Here we can open new activity return true; } else { // Stay within this webview and load url view.loadUrl(url); return true; } } //Show loader on url load public void onPageStarted(WebView view, String url, Bitmap favicon) { // Then show progress Dialog // in standard case YourActivity.this if (progressDialog == null) { progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setMessage("Loading..."); progressDialog.hide(); } } // Called when all page resources loaded public void onPageFinished(WebView view, String url) { webView.loadUrl("javascript:(function(){ " + "document.getElementById('android-app').style.display='none';})()"); try { // Close progressDialog if (progressDialog.isShowing()) { progressDialog.dismiss(); progressDialog = null; } } catch (Exception exception) { exception.printStackTrace(); } } } }