• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Please help with Camera Image upload in WebView

Tembe

Lurker
Hello, I have the following code to Upload photos from the device on WebView. The code is working already for photos from gallery. But it still doesn't give the possibility to capture the image from the device camera. I don't understand why. Can someone please help me fix the code to also give the possibility to capture photo directly from the phone camera?

Java:
package com.example.user.myapp;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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{

    public static final String PAGE_URL  = "https://www.testdomain.com";
    WebView webb;
    private static final int INPUT_FILE_REQUEST_CODE = 1;
    private static final int FILECHOOSER_RESULTCODE = 1;
    private static final String TAG = MainActivity.class.getSimpleName();
    private WebView webView;
    private WebSettings webSettings;
    private ValueCallback<Uri> mUploadMessage;
    private Uri mCapturedImageURI = null;
    private ValueCallback<Uri[]> mFilePathCallback;
    private String mCameraPhotoPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webb = (WebView) findViewById(R.id.webb1);
        webSettings = webb.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setAllowFileAccess(true);
        webb.setWebViewClient(new WebViewClient());
        webb.setWebChromeClient(new ChromeClient());
        if (Build.VERSION.SDK_INT >= 19) {
            webb.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        } else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) {
            webb.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        webb.loadUrl(PAGE_URL);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
            Uri[] results = null;

            if (resultCode == Activity.RESULT_OK) {
                if (data == null) {
                    if (mCameraPhotoPath != null) {
                        results = new Uri[]{Uri.parse(mCameraPhotoPath)};
                    }
                } else {
                    String dataString = data.getDataString();
                    if (dataString != null) {
                        results = new Uri[]{Uri.parse(dataString)};
                    }
                }
            }
            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
            if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessage == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == this.mUploadMessage) {
                    return;
                }
                Uri result = null;
                try {
                    if (resultCode != RESULT_OK) {
                        result = null;
                    } else {
                        result = data == null ? mCapturedImageURI : data.getData();
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "activity :" + e,
                            Toast.LENGTH_LONG).show();
                }
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
        }
        return;
    }
    private File createImageFile() throws IOException {
        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 ChromeClient extends WebChromeClient {
        public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) {
            if (mFilePathCallback != null) {
                mFilePathCallback.onReceiveValue(null);
            }
            mFilePathCallback = filePath;
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
                } catch (IOException ex) {
                    Log.e(TAG, "Unable to create Image File", ex);
                }

                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.setType("image/*");
            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, INPUT_FILE_REQUEST_CODE);
            return true;
        }

        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
            mUploadMessage = uploadMsg;
            File imageStorageDir = new File(
                    Environment.getExternalStoragePublicDirectory(
                            Environment.DIRECTORY_PICTURES)
                    , "ViewPeer");
            if (!imageStorageDir.exists()) {
                imageStorageDir.mkdirs();
            }
            File file = new File(
                    imageStorageDir + File.separator + "IMG_"
                            + String.valueOf(System.currentTimeMillis())
                            + ".jpg");
            mCapturedImageURI = Uri.fromFile(file);

            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/*");

            Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS
                    , new Parcelable[]{captureIntent});
            startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
        }

        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            openFileChooser(uploadMsg, "");
        }

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

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public class Client extends WebViewClient {
        ProgressDialog progressDialog;

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("mailto:")) {
                view.getContext().startActivity(
                        new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                return true;
            } else {
                view.loadUrl(url);
                return true;
            }
        }
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setMessage("Loading...");
                progressDialog.show();
            }
        }

        public void onPageFinished(WebView view, String url) {
            try {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }
}

Many thanks
 
I'm guessing the following block of code doesn't get executed

Code:
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
                } catch (IOException ex) {
                    Log.e(TAG, "Unable to create Image File", ex);
                }

                if (photoFile != null) {
                    mCameraPhotoPath = "file:" + photoFile.getAbsolutePath();
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            Uri.fromFile(photoFile));
                } else {
                    takePictureIntent = null;
                }
            }

Where did you get this code from. The usual way of launching the image capture application is like this

Code:
     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
     startActivity(intent);

See here for more details:

https://www.tutorialspoint.com/android/android_camera.htm
 
Hello,
Thank you for the response.
But when I replace le Intent creation as you suggested, the app will just crash and stop working when I click on the choose file button. Is there any reason or other possible solution?
Bellow is the AndroidManifest file to view how my permissions are set.

HTML:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sankara.myapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CAMERA2" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Thank you
 
Please post the stack trace from the Logcat view. If the application crashed it will have generated a stack trace. Thanks.
 
Also, post the exact code you were using when the application crashed.
 
Please post the stack trace from the Logcat view. If the application crashed it will have generated a stack trace. Thanks.

Hello, here is the log
Code:
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000b44
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00000bd0
E/eglCodecCommon: **** ERROR unknown type 0x0 (glSizeof,73)


And Here is the content of my MainActivity.java
Java:
package com.example.user.myapp;


import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Camera;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.net.Uri;
import android.nfc.Tag;
import android.os.Build;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.provider.SyncStateContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
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{

    public static final String PAGE_URL  = "https://www.testdomain.com";
    WebView webb;
    private static final int INPUT_FILE_REQUEST_CODE = 1;
    private static final int FILECHOOSER_RESULTCODE = 1;
    private static final String TAG = MainActivity.class.getSimpleName();
    private WebView webView;
    private WebSettings webSettings;
    private ValueCallback<Uri> mUploadMessage;
    private Uri mCapturedImageURI = null;
    private ValueCallback<Uri[]> mFilePathCallback;
    private String mCameraPhotoPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webb = (WebView) findViewById(R.id.webb1);
        webSettings = webb.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setAllowFileAccess(true);
        webb.setWebViewClient(new WebViewClient());
        webb.setWebChromeClient(new ChromeClient());
        if (Build.VERSION.SDK_INT >= 19) {
            webb.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        } else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) {
            webb.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        webb.loadUrl(PAGE_URL);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
            Uri[] results = null;

            if (resultCode == Activity.RESULT_OK) {
                if (data == null) {
                    if (mCameraPhotoPath != null) {
                        results = new Uri[]{Uri.parse(mCameraPhotoPath)};
                    }
                } else {
                    String dataString = data.getDataString();
                    if (dataString != null) {
                        results = new Uri[]{Uri.parse(dataString)};
                    }
                }
            }
            mFilePathCallback.onReceiveValue(results);
            mFilePathCallback = null;
        } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
            if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessage == null) {
                super.onActivityResult(requestCode, resultCode, data);
                return;
            }
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == this.mUploadMessage) {
                    return;
                }
                Uri result = null;
                try {
                    if (resultCode != RESULT_OK) {
                        result = null;
                    } else {
                        result = data == null ? mCapturedImageURI : data.getData();
                    }
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "activity :" + e,
                            Toast.LENGTH_LONG).show();
                }
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
        }
        return;
    }
    private File createImageFile() throws IOException {
        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 ChromeClient extends WebChromeClient {
        public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) {
            if (mFilePathCallback != null) {
                mFilePathCallback.onReceiveValue(null);
            }
            mFilePathCallback = filePath;


            //Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Intent takePictureIntent = new Intent("android.media.action.IMAGE_CAPTURE");
            startActivity(takePictureIntent);

            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                    takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);
                } catch (IOException ex) {
                    Log.e(TAG, "Unable to create Image File", ex);
                }

                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.setType("image/*");
            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, INPUT_FILE_REQUEST_CODE);
            return true;
        }

        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
            mUploadMessage = uploadMsg;
            File imageStorageDir = new File(
                    Environment.getExternalStoragePublicDirectory(
                            Environment.DIRECTORY_PICTURES)
                    , "ViewPeer");
            if (!imageStorageDir.exists()) {
                imageStorageDir.mkdirs();
            }
            File file = new File(
                    imageStorageDir + File.separator + "IMG_"
                            + String.valueOf(System.currentTimeMillis())
                            + ".jpg");
            mCapturedImageURI = Uri.fromFile(file);

            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/*");

            Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS
                    , new Parcelable[]{captureIntent});
            startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
        }

        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            openFileChooser(uploadMsg, "");
        }

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

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public class Client extends WebViewClient {
        ProgressDialog progressDialog;

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("mailto:")) {
                view.getContext().startActivity(
                        new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                return true;
            } else {
                view.loadUrl(url);
                return true;
            }
        }
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setMessage("Loading...");
                progressDialog.show();
            }
        }

        public void onPageFinished(WebView view, String url) {
            try {
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }
}



And here is the content of my AndroidManifest.xml

HTML:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.user.myapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CAMERA2" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Thanks in advance
 
HI

can you tell me please what storage permission to give?

i already tried a bunch of permissions such as the following added to the manifest but camera doest appear as an option

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CAMERA2" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />

BTW

camera works on android 5.1.1 API 22
but not on
android 6 and above



Please advice thank you so much
 
Last edited:
Back
Top Bottom