Мне удалось заставить пользователей загружать фотографии на сервер, взятые из их галереи, но когда пользователь использует камеру для съемки в реальном времени и загрузки, я получаю эту ошибку неподдерживаемая схема: 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 /