当前位置: 首页 > 知识库问答 >
问题:

Android Webview中的照片/文档上传

司空浩邈
2023-03-14

我正在为Android开发一个包装应用程序,需要连接到相机/照片库(这样用户就可以上传一张自己的照片,例如)。我发现了许多关于这个主题的帖子,包括在WebView中从相机或图库上传图像,以及从WebView输入字段上传相机照片和文件回声器,但我根据这些解决方案建模的代码不起作用。我在openFileChooser函数中放置了一个print语句,当在WebView中单击add Photo/Document Javascript链接时,它不会被触发。任何建议都将不胜感激,我在下面包括我的代码:

 private Uri mCapturedImageURI = null;

//make HTML upload button work in Webview
private ValueCallback<Uri> mUploadMessage;
private String filePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_log_in_page);
    Intent currentIntent = getIntent();
    String action = currentIntent.getAction();
    String url;

    //check for permissions
    boolean camera = checkCameraPermissions();
    boolean location = checkLocationPermissions();
    boolean photos = checkPhotoPermissions();


    if (!location){
        ActivityCompat.requestPermissions(this,
                new String[] {"android.permission.ACCESS_FINE_LOCATION"}, REQUEST_LOCATION);
        requested_location = true;
    }


    if (!camera ) {
        ActivityCompat.requestPermissions(this,
                new String[] {"android.permission.CAMERA"}, REQUEST_CAMERA);
        requested_camera = true;
    }


    if (!photos) {
        ActivityCompat.requestPermissions(this,
                new String[] {"android.permission.READ_EXTERNAL_STORAGE"}, REQUEST_PHOTOS);
        requested_photos = true;
    }

    url =  Constants.login_page;

    //start up the webview, initiate navigation client
    myWebView = (WebView) findViewById(R.id.webview);
    if (myWebView != null) {
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setDomStorageEnabled(true);
        myWebView.getSettings().setAllowFileAccess(true);
        myWebView.getSettings().setAllowFileAccessFromFileURLs(true);
        myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        myWebView.getSettings().setSupportMultipleWindows(true);
        myWebView.getSettings().setGeolocationEnabled(true);
        myWebView.setWebChromeClient(new WebChromeClient() {

            public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                callback.invoke(origin, true, false);
            }

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType){
                this.openFileChooser(uploadMsg);
            }

            @SuppressWarnings("unused")
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {
                this.openFileChooser(uploadMsg);
            }

            private Uri imageUri;

            public void openFileChooser(ValueCallback<Uri> uploadMsg ) {
                // Update message
                mUploadMessage = uploadMsg;

                System.out.println("we are here");

                File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "my_app");
                filePath = imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg";
                File file = new File(filePath);

                Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                LogInPage.this.startActivityForResult(captureIntent, REQUEST_PHOTOS);
            }

            });
        //myWebView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");
        myWebView.loadUrl(url);
        myWebView.setWebViewClient(new NavigationClient());
    }
}




   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if ((requestCode == SELECT_PHOTO) ||(requestCode == REQUEST_CAMERA)) {
        if (null == this.mUploadMessage || (resultCode != RESULT_OK && !new File(filePath).exists())) {
            this.mUploadMessage.onReceiveValue(null);
        } else {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, this.filePath);
            this.mUploadMessage.onReceiveValue(this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values));
        }
        this.mUploadMessage = null;
    }
}

共有1个答案

司寇照
2023-03-14

看起来您正在打开一个StartActivityForResult,结果代码Request_Photos,但是在OnActivityResult中,您要检查代码Request_PhotosRequest_Camera。所以你永远不会处理结果。将onActivityResult改为:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {

        if ((requestCode == REQUEST_PHOTOS) ) {
            if (null == this.mUploadMessage || (resultCode != RESULT_OK && !new File(filePath).exists())) {
                this.mUploadMessage.onReceiveValue(null);
            } else {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DATA, this.filePath);
                this.mUploadMessage.onReceiveValue(getActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values));
            }
            this.mUploadMessage = null;
        }
    }
 类似资料:
  • 自动识别图像进行照片上色处理模式一 返回二进制文件流模式二 返回base64字符串模式三 通过图片url返回base64结果 照片上色API调用示例代码 github地址: https://github.com/picup-shop cURL Python PHP Java nodejs .net Objective-C curl -H 'APIKEY: INSERT_YOUR_API_KEY_H

  • 操作步骤: ①在"图层管理"模块,选择一个带有数据的图层。 ②点击记录弹出窗口。 ③点击"上传图片"按钮。 ④可以添加标注地点的照片信息,支持从本地上传和选择网络上的图片以及历史图片。 ⑤选择图片,进行添加图片。 ⑥点击"绑定图片"按钮。 提示: ●目前一个网点支持上传20张照片。 ●每张图片大小不超过5M。 操作动图: [查看原图]

  • 我正在尝试从sdcard拍摄照片,它是工作的情况下,当用户选择从谷歌照片,但给出一个curserindexoutofbound错误时,从任何其他应用程序,如gallery或file Manager。这是一段代码。 OnActivity Result`{if(requestCode==PICK_IMAGE_REQUEST&&resultCode==activity.result_ok&data!=n

  • 我正在尝试从Firebase的DocumentSnapshot中获取数据。 此方法完全正常并返回true,但是: 返回false... 有人有想法吗,为什么会这样?这只是我申请中的一个小问题,但我很好奇为什么会这样。只是为了理解。谢谢你! 编辑: 以下是购物车集合的屏幕截图: 以下是产品集合的屏幕截图:

  • 问题:我使用的意图是允许用户选择照片。当他们从设备上的图像中选择照片时,我能够使用ExifInterface获得纬度和经度。然而,当他们从谷歌照片中选择照片时,我无法从uri返回中获得地理位置。 详细信息:我使用的意图如下所示: 当用户从Google Photos中选择一张未存储在设备上的照片时,Google Photos首先下载该照片并返回一个URI,该URI不包括设备上的位置。我正在使用它将流

  • 我试图构建一个,它包括两个按钮,一个用于用相机拍照并上传到Firebase存储,另一个用于从Firebase存储下载图像并在上显示。 现在,我被上传功能卡住了。我可以把照片保存到应用程序目录中。我想上传保存的图片到Firebase存储。