首页 > 解决方案 > 从 Android webview 相机拍摄的图像未保存到文件夹

问题描述

我有这个我在https://github.com/上获得的 Smart Webview,这很棒。作为 Android 新手开发人员,我一直在尝试解决这个问题。如果我从电话目录中选择图像并发送到后端(PHP);一切正常:图像被移动到上传文件夹;但是如果我使用 Android 相机拍照,图像永远不会发送到文件夹,但图像的名称会保存到数据库中。

图片上传的MainActivity

 // handling input[type="file"]
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams){
            if(check_permission(2) && check_permission(3)) {
                if (ASWP_FUPLOAD) {
                    asw_file_path = filePathCallback;
                    Intent takePictureIntent = null;
                    Intent takeVideoIntent = null;
                    if (ASWP_CAMUPLOAD) {
                        boolean includeVideo = false;
                        boolean includePhoto = false;

                        // Check the accept parameter to determine which intent(s) to include.
                        paramCheck:
                        for (String acceptTypes : fileChooserParams.getAcceptTypes()) {
                            // Although it's an array, it still seems to be the whole value.
                            // Split it out into chunks so that we can detect multiple values.
                            String[] splitTypes = acceptTypes.split(", ?+");
                            for (String acceptType : splitTypes) {
                                switch (acceptType) {
                                    case "*/*":
                                        includePhoto = true;
                                        includeVideo = true;
                                        break paramCheck;
                                    case "image/*":
                                        includePhoto = true;
                                        break;
                                    case "video/*":
                                        includeVideo = true;
                                        break;
                                }
                            }
                        }

                        // If no `accept` parameter was specified, allow both photo and video.
                        if (fileChooserParams.getAcceptTypes().length == 0) {
                            includePhoto = true;
                            includeVideo = true;
                        }

                        if (includePhoto) {
                            takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            if (takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) {
                                File photoFile = null;
                                try {
                                    photoFile = create_image();
                                    takePictureIntent.putExtra("PhotoPath", asw_pcam_message);
                                } catch (IOException ex) {
                                    Log.e(TAG, "Image file creation failed", ex);
                                }
                                if (photoFile != null) {
                                    asw_pcam_message = "file:" + photoFile.getAbsolutePath();
                                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                                } else {
                                    takePictureIntent = null;
                                }
                            }
                        }

                        if (includeVideo) {
                            takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                            if (takeVideoIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) {
                                File videoFile = null;
                                try {
                                    videoFile = create_video();
                                } catch (IOException ex) {
                                    Log.e(TAG, "Video file creation failed", ex);
                                }
                                if (videoFile != null) {
                                    asw_vcam_message = "file:" + videoFile.getAbsolutePath();
                                    takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoFile));
                                } else {
                                    takeVideoIntent = null;
                                }
                            }
                        }
                    }

                    Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    if (!ASWP_ONLYCAM) {
                        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                        contentSelectionIntent.setType(ASWV_F_TYPE);
                        if (ASWP_MULFILE) {
                            contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                        }
                    }
                    Intent[] intentArray;
                    if (takePictureIntent != null && takeVideoIntent != null) {
                        intentArray = new Intent[]{takePictureIntent, takeVideoIntent};
                    } else if (takePictureIntent != null) {
                        intentArray = new Intent[]{takePictureIntent};
                    } else if (takeVideoIntent != null) {
                        intentArray = new Intent[]{takeVideoIntent};
                    } else {
                        intentArray = new Intent[0];
                    }

                    Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                    chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                    chooserIntent.putExtra(Intent.EXTRA_TITLE, getString(R.string.fl_chooser));
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
                    startActivityForResult(chooserIntent, asw_file_req);
                }
                return true;
            }else{
                get_file();
                return false;
            }
        }

//Creating image file for upload
    private File create_image() throws IOException {
        @SuppressLint("SimpleDateFormat")
        String file_name    = new SimpleDateFormat("yyyy_mm_ss").format(new Date());
        String new_name     = "file_"+file_name+"_";
        File sd_directory   = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        return File.createTempFile(new_name, ".jpg", sd_directory);
    }

    //Creating video file for upload
    private File create_video() throws IOException {
        @SuppressLint("SimpleDateFormat")
        String file_name    = new SimpleDateFormat("yyyy_mm_ss").format(new Date());
        String new_name     = "file_"+file_name+"_";
        File sd_directory   = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        return File.createTempFile(new_name, ".3gp", sd_directory);
    }

处理上传的 PHP

if(isset($_FILES['photo'])){
  $upload_dir = 'profile_img/'; // upload directory
  $email = $_POST['email'];


   $imgFile = $_FILES['photo']['name'];
   $tmp_dir = $_FILES['photo']['tmp_name'];
   $imgSize = $_FILES['photo']['size'];
   $imgType = $_FILES['photo']['type'];
  

  $imgExt = strtolower(pathinfo($imgFile,PATHINFO_EXTENSION)); // get image extension

// valid image extensions
  $valid_extensions = array('jpeg', 'jpg', 'png'); // image extensions
  $vid_extensions = array('avi', 'mp4', 'wav','3gp','AAC','flv','wmv'); // video extensions
  $aud_extensions = array('mp3'); // audio extensions

   // rename uploading image
    $userpic = rand(1000,1000000).".".$imgExt;
    if(!empty($imgFile)){
    $pic = $userpic;
    }else{
        $pic = '';
    }
    
   if(!empty($imgFile) && in_array($imgExt, $valid_extensions)){
        move_uploaded_file($tmp_dir,$upload_dir.$pic);
    }
    if(!empty($imgFile) && in_array($imgExt, $vid_extensions)){
        move_uploaded_file($tmp_dir,$video.$pic);
    }
    if(!empty($imgFile) && in_array($imgExt, $aud_extensions)){
        move_uploaded_file($tmp_dir,$audio.$pic);
    }


$query = mysqli_query($mysqli,"UPDATE customer_login SET img = '$pic' WHERE email='$email'");
if($query){
  echo 1;
}else{
  echo "Error occured: ".$mysqli->error;
}

}

标签: phpandroid

解决方案


Uri.fromFile(photoFile))

从 Android N/7 开始,您不能使用文件 uri。

它将产生 FileUriExposedException。

改用 FileProvider.getUriForFile() 来获取内容方案 uri。


推荐阅读