【问题标题】:Is there a way to implement photo capture functionality in android webview?有没有办法在 android webview 中实现照片捕捉功能?
【发布时间】:2020-05-28 18:42:38
【问题描述】:

我正在尝试使用文件上传在 android webview 中实现照片捕获功能。基本上当用户点击上传文件按钮时,系统应该启动相机并拍照。

【问题讨论】:

    标签: android webview android-webview


    【解决方案1】:
    public class LoginActivity extends AppCompatActivity implements UpdateHelper.onUpdateCheckListener {
        private static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
        public WebView webView;
        public ImageView imageView;
        private VideoView videoView;
        private ValueCallback<Uri> mUploadMessage;
        public ValueCallback<Uri[]> uploadMessage;
        public static final int REQUEST_SELECT_FILE = 100;
        private final static int FILECHOOSER_RESULTCODE = 1;
    
        @SuppressLint({"SetJavaScriptEnabled", "NewApi"})
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            UpdateHelper.with(this).onUpdateCheck(this).check();
            webView = findViewById(R.id.webview);
            imageView = findViewById(R.id.img);
            videoView = findViewById(R.id.videoview);
            videoView.setZOrderOnTop(true);
    
            WebClient webClient = new WebClient();
            String path = "android.resource://" + getPackageName() + "/" + R.raw.vv;
            videoView.setVideoURI(Uri.parse(path));
            videoView.start();
    
            imageView.setVisibility(View.GONE);
            webView.setVisibility(View.GONE);
            webView.setWebChromeClient(new WebChromeClient());
            webView.getSettings().setLoadsImagesAutomatically(true);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setAllowFileAccess(true);
            webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            webView.getSettings().setPluginState(WebSettings.PluginState.ON);
            //webView.getSettings().setMediaPlaybackRequiresUserGesture(true);
            webView.loadUrl("https://www.w3schools.com/html/html5_video.asp");
            webView.getSettings().setAllowFileAccess(true);
            webView.getSettings().setAllowFileAccess(true);
            webView.getSettings().setAllowContentAccess(true);
    
    
    
    
    
            videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    
                @Override
                public void onCompletion(MediaPlayer mp) {
                    videoView.setVisibility(View.GONE);
                }
            });
    
    
            webView.setWebChromeClient(new WebChromeClient() {
    
    
    
    
                public void onProgressChanged(WebView view, int progress) {
    
                    if (progress == 100) {
                        imageView.setVisibility(View.GONE);
                        videoView.setVisibility(View.GONE);
                        webView.setVisibility(View.VISIBLE);
    
    
                    }
                }
    
                // For 3.0+ Devices (Start)
                // onActivityResult attached before constructor
                protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");
                    startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
                }
    
    
                // For Lollipop 5.0+ Devices
                public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                    if (uploadMessage != null) {
                        uploadMessage.onReceiveValue(null);
                        uploadMessage = null;
                    }
    
                    uploadMessage = filePathCallback;
    
                    Intent intent = fileChooserParams.createIntent();
                    try {
                        startActivityForResult(intent, REQUEST_SELECT_FILE);
                    } catch (ActivityNotFoundException e) {
                        uploadMessage = null;
                        Toast.makeText(LoginActivity.this, "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
                        return false;
                    }
                    return true;
                }
    
                //For Android 4.1 only
                protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                    mUploadMessage = uploadMsg;
                    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                    intent.addCategory(Intent.CATEGORY_OPENABLE);
                    intent.setType("image/*");
                    startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
                }
    
                protected void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");
                    startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
                }
    
    
            });
    
    
            webView.setDownloadListener(new DownloadListener() {
    
                @Override
                public void onDownloadStart(String url, String userAgent,
                                            String contentDisposition, String mimetype,
                                            long contentLength) {
                    if (checkLocationPermission()) {
                        DownloadManager.Request request = new DownloadManager.Request(
                                Uri.parse(url));
    
                        request.allowScanningByMediaScanner();
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, random());
                        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                        dm.enqueue(request);
                        Toast.makeText(getApplicationContext(), "Downloading File", //To notify the Client that the file is being downloaded
                                Toast.LENGTH_LONG).show();
                    }
    
                }
            });
            webView.setWebViewClient(webClient);
    //        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    //        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            webView.setBackgroundColor(Color.TRANSPARENT);
    
            if (isNetworkConnected()) {
                webView.loadUrl("http://v-tube.xyz/login");
                //  videoView.setVisibility(View.GONE);
            } else {
                imageView.setImageResource(R.drawable.nointernet);
                imageView.setVisibility(View.VISIBLE);
                webView.setVisibility(View.GONE);
                Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onBackPressed() {
            if (webView.canGoBack()) {
                webView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    
    
        private boolean isNetworkConnected() {
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
            return cm.getActiveNetworkInfo() != null;
        }
    
        @Override
        public void onUpdateCheckListener(String urlApp) {
            androidx.appcompat.app.AlertDialog alertDialog = new androidx.appcompat.app.AlertDialog.Builder(this).setTitle("Update Your App").setMessage("Please Update Your App to new Version.").setPositiveButton("UPDATE", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
    
    
                }
            }).create();
    
            alertDialog.show();
        }
    
    
        public class WebClient extends WebViewClient {
    
            @Override
            @TargetApi(Build.VERSION_CODES.M)
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                webView.loadUrl("file:///android_asset/error.html");
            }
    
            @SuppressWarnings("deprecation")
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                webView.loadUrl("file:///android_asset/error.html");
            }
    
            private void handleError(WebView view, int errorCode, String description, final Uri uri) {
                webView.loadUrl("file:///android_asset/error.html");
            }
    
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return false;
    
    
            }
        }
    
        public boolean checkLocationPermission() {
            if (ContextCompat.checkSelfPermission(LoginActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
    
                // Should we show an explanation?
                if (ActivityCompat.shouldShowRequestPermissionRationale(LoginActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    
                    // Show an explanation to the user *asynchronously* -- don't block
                    // this thread waiting for the user's response! After the user
                    // sees the explanation, try again to request the permission.
                    new AlertDialog.Builder(LoginActivity.this)
                            .setTitle("Permission")
                            .setMessage("Please Share/on Your Location")
                            .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    //Prompt the user once explanation has been shown
                                    ActivityCompat.requestPermissions(LoginActivity.this,
                                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                            MY_PERMISSIONS_REQUEST_LOCATION);
                                    startActivity(new Intent(LoginActivity.this, LoginActivity.class));
                                    LoginActivity.this.overridePendingTransition(0, 0);
                                }
                            })
                            .create()
                            .show();
    
    
                } else {
                    // No explanation needed, we can request the permission.
                    ActivityCompat.requestPermissions(LoginActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_REQUEST_LOCATION);
    
                }
    
                return false;
            } else {
    
                return true;
    
            }
        }
    
        public static String random() {
            Random generator = new Random();
            StringBuilder randomStringBuilder = new StringBuilder();
            int randomLength = generator.nextInt(5);
            char tempChar;
            for (int i = 0; i < randomLength; i++) {
                tempChar = (char) (generator.nextInt(96) + 32);
                randomStringBuilder.append(tempChar);
            }
            return randomStringBuilder.toString();
        }
    
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent intent) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                if (requestCode == REQUEST_SELECT_FILE) {
                    if (uploadMessage == null)
                        return;
                    uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
                    uploadMessage = null;
                }
            } else if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == mUploadMessage)
                    return;
                // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
                // Use RESULT_OK only if you're implementing WebView inside an Activity
                Uri result = intent == null || resultCode != LoginActivity.RESULT_OK ? null : intent.getData();
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            } else
                Toast.makeText(LoginActivity.this, "Failed to Upload Image", Toast.LENGTH_LONG).show();
        }
    
    }
    

    【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多