Как загрузить изображения, полученные с камеры, используя Android Сервис загрузки - PullRequest
1 голос
/ 08 января 2020

Мне удалось заставить пользователей загружать фотографии на сервер, взятые из их галереи, но когда пользователь использует камеру для съемки в реальном времени и загрузки, я получаю эту ошибку неподдерживаемая схема: file :: /// storage /. ..

Я использую android библиотеку службы загрузки

implementation "net.gotev:uploadservice:3.5.2"

Я искал и обнаружил, что схема file: // не может быть прикреплена с помощью Intent.

1. Выбор изображения с камеры по нажатию кнопки

capture_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, 
 FileProvider.getUriForFile(UploadActivity2.this, BuildConfig.APPLICATION_ID + ".provider", 
 createImageFile()));
                startActivityForResult(intent, 0);
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        }
    });

2. Получение захваченного изображения

if (resultCode == Activity.RESULT_OK)
        switch (requestCode){
            case 0:
  try {
                 Uri cameraPath =    FileProvider.getUriForFile(UploadActivity2.this, 
  BuildConfig.APPLICATION_ID + ".provider", createImageFile());
                 String stringUri = cameraPath.toString();
                 selectedImages.add(stringUri);

                }catch (IOException ex) {
                    ex.printStackTrace();
 Glide.with(this)
                        .load(cameraFilePath)
                        .into(display_image);
 break;
        }
     }

Как вы видите, я использую файловый провайдер для получения Uri и сохраняю uri в переменной с именем selectedimages , чтобы я мог передать его через намерение выполнить другое действие, в котором происходит загрузка

метод createImageFile

  private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.UK).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    //This is the directory in which the file will be created. This is the default location of Camera photos
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DCIM), "Camera");
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );
    // Save a file: path for using again
    cameraFilePath = "file://" + image.getAbsolutePath();
    return image;
   }

3. Передача намерения PATH, для загрузки активности

next_upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(UploadActivity2.this, UploadActivity3.class);
            intent.putStringArrayListExtra("PATH", selectedImages);
            startActivity(intent);
        }
    });

5. UploadAcvity, где происходит загрузка

public void upload() {
    ArrayList<String> selectedImages = getIntent().getStringArrayListExtra("PATH");
try {
        String uploadId = UUID.randomUUID().toString();

        //Creating a multi part request
        new MultipartUploadRequest(this, uploadId, EndPoints.UPLOAD_URL)
                .addFileToUpload(selectedImages.get(0), "image") //Adding file
                .addParameter("caption", captionx) //Adding text parameter to the request
                .setNotificationConfig(new UploadNotificationConfig())
                .setMaxRetries(0)
                .startUpload(); //Starting the upload

    } catch (Exception exc) {
        Toast.makeText(this, exc.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

Использование этого.

a. Изображение не отображается в точка 2 с использованием Glide.with (this) .load (cameraFilePath) .into (display_image);

b. Изображение загружается, но это пустой файл размером 0 байт.

Но когда я изменяю значение переменной selectedImages в точке 2 из selectedImages .add (stringUri); до selectedImages.add (cameraFilePath);

b. После нажатия кнопки загрузки я получаю ошибку неподдерживаемая схема: file :: /// storage /

1 Ответ

0 голосов
/ 08 января 2020

Найден ответ.

1. В методе createImageFile . Мне нужно было получить coontent: // url из захваченного файла, используя -

File newFile = new File(storageDir, image.getName());
    contentUrl = FileProvider.getUriForFile(UploadActivity2.this, 
BuildConfig.APPLICATION_ID + ".provider", newFile);
    stringContentUrl = contentUrl.toString();

2. Затем я передал stringContentUrl в выбранную строку изображений во время получения захваченного изображения.

selectedImages.add(stringContentUrl);

3. Пропустил его через намерение Extra и вызвал его в uploadActivity, как видно в пункте 3 и 4 в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...