Open File Chooser With Camera Option In Webview File Option

DOWNLOAD CODE

Related Examples

In this example:

   1.  Opening url in webview and show progress for particular page.

   2.  Show file chooser for Webform file option.

   3.  Show Camera option in file chooser, capture image from camera and store in sdcard and select image for file option.

   4.  For an url click open new activity.

   5.  Open link from webview browser to new browser.

   6.  Open link from webview browser to webview browser.
 

 

FILE : ShowWebView.java

 

Code explanation defined as comments in code.

 


    package com.androidexample.webview;
    
    import java.io.File;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Parcelable;
    import android.provider.MediaStore;
    import android.webkit.ConsoleMessage;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.webkit.WebSettings.PluginState;
    import android.widget.Toast;
    
    public class ShowWebView extends Activity {
    
        //private Button button;
        private WebView webView;
        final Activity activity = this;
        public Uri imageUri;
        
        private static final int FILECHOOSER_RESULTCODE   = 2888;
        private ValueCallback<Uri> mUploadMessage;
        private Uri mCapturedImageURI = null;
        
       
        public void onCreate(Bundle savedInstanceState) {
            
            super.onCreate(savedInstanceState);
            
            setContentView(R.layout.show_web_view);
            
            //Get webview 
            webView = (WebView) findViewById(R.id.webView1);
            
            // Define url that will open in webview	
            String webViewUrl = "http://www.androidexample.com/media/webview/details.html";
            
               
            
            // Javascript inabled on webview  
            webView.getSettings().setJavaScriptEnabled(true);
            
            // Other webview options
            webView.getSettings().setLoadWithOverviewMode(true);
            
            //webView.getSettings().setUseWideViewPort(true);
            
            //Other webview settings
            webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
            webView.setScrollbarFadingEnabled(false);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.getSettings().setPluginState(PluginState.ON);
            webView.getSettings().setAllowFileAccess(true);
            webView.getSettings().setSupportZoom(true); 
            
            //Load url in webview
            webView.loadUrl(webViewUrl);
            
            // Define Webview manage classes
            startWebView(); 
            
        } 
        
        private void startWebView() {
            
            
            
            // Create new webview Client to show progress dialog
            // Called When opening a url or click on link
            // You can create external class extends with WebViewClient 
            // Taking WebViewClient as inner class
            
            webView.setWebViewClient(new WebViewClient() {      
                ProgressDialog progressDialog;
             
                //If you will not use this method url links are open in new brower not in webview
                public boolean shouldOverrideUrlLoading(WebView view, String url) {              
                    
                    // Check if Url contains ExternalLinks string in url 
                    // then open url in new browser
                    // else all webview links will open in webview browser
                    if(url.contains("google")){ 
                        
                        // 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 onLoadResource (WebView view, String url) {
                
                    // if url contains string androidexample
                    // Then show progress  Dialog
                    if (progressDialog == null && url.contains("androidexample") 
                            ) {
                        
                        // in standard case YourActivity.this
                        progressDialog = new ProgressDialog(ShowWebView.this);
                        progressDialog.setMessage("Loading...");
                        progressDialog.show();
                    }
                }
                
                // Called when all page resources loaded
                public void onPageFinished(WebView view, String url) {
                    
                    try{
                        // Close progressDialog
                        if (progressDialog.isShowing()) {
                            progressDialog.dismiss();
                            progressDialog = null;
                        }
                    }catch(Exception exception){
                        exception.printStackTrace();
                    }
                }
               
            }); 
             
              
            // You can create external class extends with WebChromeClient 
            // Taking WebViewClient as inner class
            // we will define openFileChooser for select file from camera or sdcard
            
            webView.setWebChromeClient(new WebChromeClient() {
                
                // openFileChooser for Android 3.0+
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){  
                   
                    // Update message
                    mUploadMessage = uploadMsg;
                    
                    try{	
                    
                        // Create AndroidExampleFolder at sdcard
                        
                        File imageStorageDir = new File(
                                               Environment.getExternalStoragePublicDirectory(
                                               Environment.DIRECTORY_PICTURES)
                                               , "AndroidExampleFolder");
                                               
                        if (!imageStorageDir.exists()) {
                            // Create AndroidExampleFolder at sdcard
                            imageStorageDir.mkdirs();
                        }
                        
                        // Create camera captured image file path and name 
                        File file = new File(
                                        imageStorageDir + File.separator + "IMG_" 
                                        + String.valueOf(System.currentTimeMillis()) 
                                        + ".jpg");
                                        
                        mCapturedImageURI = Uri.fromFile(file); 
                        
                        // Camera capture image intent
                        final Intent captureIntent = new Intent(
                                                      android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                                                      
                        captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
                       
                        Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
                        i.addCategory(Intent.CATEGORY_OPENABLE);
                        i.setType("image/*");
                        
                        // Create file chooser intent
                        Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
                        
                        // Set camera intent to file chooser 
                        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS
                                               , new Parcelable[] { captureIntent });
                        
                        // On select image call onActivityResult method of activity
                        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
                        
                      }
                     catch(Exception e){
                         Toast.makeText(getBaseContext(), "Exception:"+e, 
                                    Toast.LENGTH_LONG).show();
                     }
                    
                }
                
                // openFileChooser for Android < 3.0
                public void openFileChooser(ValueCallback<Uri> uploadMsg){
                    openFileChooser(uploadMsg, "");
                }
                
                //openFileChooser for other Android versions
                public void openFileChooser(ValueCallback<Uri> uploadMsg, 
                                           String acceptType, 
                                           String capture) {
                                           
                    openFileChooser(uploadMsg, acceptType);
                }
    
    
    
                // The webPage has 2 filechoosers and will send a 
                // console message informing what action to perform, 
                // taking a photo or updating the file
                
                public boolean onConsoleMessage(ConsoleMessage cm) {  
                      
                    onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
                    return true;
                }
                
                public void onConsoleMessage(String message, int lineNumber, String sourceID) {
                    //Log.d("androidruntime", "Show console messages, Used for debugging: " + message);
                    
                }
            });   // End setWebChromeClient
             
        }
        
        
        
        // Return here when file selected from camera or from SDcard
        
        @Override  
        protected void onActivityResult(int requestCode, int resultCode,  
                                           Intent intent) { 
            
         if(requestCode==FILECHOOSER_RESULTCODE)  
         {  
           
                if (null == this.mUploadMessage) {
                    return;
    
                }
    
               Uri result=null;
               
               try{
                    if (resultCode != RESULT_OK) {
                        
                        result = null;
                        
                    } else {
                        
                        // retrieve from the private variable if the intent is null
                        result = intent == null ? mCapturedImageURI : intent.getData(); 
                    } 
                }
                catch(Exception e)
                {
                    Toast.makeText(getApplicationContext(), "activity :"+e,
                     Toast.LENGTH_LONG).show();
                }
                
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
         
         }
            
        }
        
        // Open previous opened link from history on webview when back button pressed
        
        @Override
        // Detect when the back button is pressed
        public void onBackPressed() {
        
            if(webView.canGoBack()) {
            
                webView.goBack();
                
            } else {
                // Let the system handle the back button
                super.onBackPressed();
            }
        }
    
    }


 

FILE : show_web_view.xml

 

Define webview inside this file.

 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
          
       <WebView  
        android:id="@+id/webView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />       
    </LinearLayout>

 

 

FILE : AndroidManifest.xml

 

Define sdcard and camera permission.

 

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.androidexample.webview"
        android:versionCode="1"
        android:versionName="1.0" >
       
        <uses-sdk
            android:minSdkVersion="8"/>
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            
            <activity
                android:label="@string/app_name"
                android:name=".ShowWebView" 
                android:theme="@android:style/Theme.NoTitleBar">
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>