Fixed issue when capturing image from camera from file picker intent

This commit is contained in:
Sylvain Berfini 2021-02-15 11:46:39 +01:00
parent 732e405c59
commit 7f2b3e9f5e
4 changed files with 72 additions and 60 deletions

View file

@ -35,6 +35,7 @@ import android.webkit.MimeTypeMap
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.view.menu.MenuPopupHelper import androidx.appcompat.view.menu.MenuPopupHelper
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -343,9 +344,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
data, data,
chatSendingViewModel.temporaryFileUploadPath chatSendingViewModel.temporaryFileUploadPath
)) { )) {
if (fileToUploadPath != null) { chatSendingViewModel.addAttachment(fileToUploadPath)
chatSendingViewModel.addAttachment(fileToUploadPath)
}
} }
} }
} }
@ -489,10 +488,16 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
// Allows to capture directly from the camera // Allows to capture directly from the camera
val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val tempFileName = System.currentTimeMillis().toString() + ".jpeg" val tempFileName = System.currentTimeMillis().toString() + ".jpeg"
chatSendingViewModel.temporaryFileUploadPath = val file = FileUtils.getFileStoragePath(tempFileName)
FileUtils.getFileStoragePath(tempFileName) chatSendingViewModel.temporaryFileUploadPath = file
val uri = Uri.fromFile(chatSendingViewModel.temporaryFileUploadPath) val publicUri = FileProvider.getUriForFile(
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) requireContext(),
requireContext().getString(R.string.file_provider),
file
)
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, publicUri)
captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
cameraIntents.add(captureIntent) cameraIntents.add(captureIntent)
} }

View file

@ -22,10 +22,10 @@ package org.linphone.activities.main.contact.fragments
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
import android.provider.MediaStore import android.provider.MediaStore
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
@ -162,9 +162,16 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
// Allows to capture directly from the camera // Allows to capture directly from the camera
val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val tempFileName = System.currentTimeMillis().toString() + ".jpeg" val tempFileName = System.currentTimeMillis().toString() + ".jpeg"
temporaryPicturePath = FileUtils.getFileStoragePath(tempFileName) val file = FileUtils.getFileStoragePath(tempFileName)
val uri = Uri.fromFile(temporaryPicturePath) temporaryPicturePath = file
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) val publicUri = FileProvider.getUriForFile(
requireContext(),
requireContext().getString(R.string.file_provider),
file
)
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, publicUri)
captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
cameraIntents.add(captureIntent) cameraIntents.add(captureIntent)
} }

View file

@ -21,10 +21,10 @@ package org.linphone.activities.main.sidemenu.fragments
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
import android.provider.MediaStore import android.provider.MediaStore
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import java.io.File import java.io.File
@ -139,9 +139,16 @@ class SideMenuFragment : GenericFragment<SideMenuFragmentBinding>() {
// Allows to capture directly from the camera // Allows to capture directly from the camera
val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val tempFileName = System.currentTimeMillis().toString() + ".jpeg" val tempFileName = System.currentTimeMillis().toString() + ".jpeg"
temporaryPicturePath = FileUtils.getFileStoragePath(tempFileName) val file = FileUtils.getFileStoragePath(tempFileName)
val uri = Uri.fromFile(temporaryPicturePath) temporaryPicturePath = file
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) val publicUri = FileProvider.getUriForFile(
requireContext(),
requireContext().getString(R.string.file_provider),
file
)
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, publicUri)
captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
cameraIntents.add(captureIntent) cameraIntents.add(captureIntent)
} }

View file

@ -73,69 +73,62 @@ class ImageUtils {
suspend fun getFilesPathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): List<String> { suspend fun getFilesPathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): List<String> {
var imageFilePath: String? = null var imageFilePath: String? = null
if (temporaryImageFilePath != null) { if (data != null) {
if (data != null) { val clipData = data.clipData
val clipData = data.clipData if (clipData != null) { // Multiple selection
if (clipData != null) { // Multiple selection Log.i("[Image Utils] Found ${clipData.itemCount} elements")
Log.i("[Image Utils] Found ${clipData.itemCount} elements") val list = arrayListOf<String>()
val list = arrayListOf<String>() for (i in 0 until clipData.itemCount) {
for (i in 0 until clipData.itemCount) { val dataUri = clipData.getItemAt(i).uri
val dataUri = clipData.getItemAt(i).uri
if (dataUri != null) {
imageFilePath = dataUri.toString()
Log.i("[Image Utils] Using data URI $imageFilePath")
}
imageFilePath = cleanFilePath(imageFilePath)
if (imageFilePath != null) list.add(imageFilePath)
}
return list
} else { // Single selection
val dataUri = data.data
if (dataUri != null) { if (dataUri != null) {
imageFilePath = dataUri.toString() imageFilePath = dataUri.toString()
Log.i("[Image Utils] Using data URI $imageFilePath") Log.i("[Image Utils] Using data URI $imageFilePath")
} else if (temporaryImageFilePath.exists()) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data URI is null, using $imageFilePath")
} }
imageFilePath = cleanFilePath(imageFilePath) imageFilePath = cleanFilePath(imageFilePath)
if (imageFilePath != null) return arrayListOf(imageFilePath) if (imageFilePath != null) list.add(imageFilePath)
}
return list
} else { // Single selection
val dataUri = data.data
if (dataUri != null) {
imageFilePath = dataUri.toString()
Log.i("[Image Utils] Using data URI $imageFilePath")
} else if (temporaryImageFilePath?.exists() == true) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data URI is null, using $imageFilePath")
} }
} else if (temporaryImageFilePath.exists()) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data is null, using $imageFilePath")
imageFilePath = cleanFilePath(imageFilePath) imageFilePath = cleanFilePath(imageFilePath)
if (imageFilePath != null) return arrayListOf(imageFilePath) if (imageFilePath != null) return arrayListOf(imageFilePath)
} }
} else if (temporaryImageFilePath?.exists() == true) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data is null, using $imageFilePath")
imageFilePath = cleanFilePath(imageFilePath)
if (imageFilePath != null) return arrayListOf(imageFilePath)
} }
return arrayListOf() return arrayListOf()
} }
suspend fun getFilePathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): String? { suspend fun getFilePathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): String? {
var imageFilePath: String? = null var imageFilePath: String? = null
if (temporaryImageFilePath != null) { if (data != null) {
if (data != null) { val clipData = data.clipData
val clipData = data.clipData if (clipData != null) { // Multiple selection
if (clipData != null) { // Multiple selection Log.e("[Image Utils] Expecting only one file, got ${clipData.itemCount}")
for (i in 0 until clipData.itemCount) { } else { // Single selection
val uri = clipData.getItemAt(i).uri val dataUri = data.data
} if (dataUri != null) {
} else { // Single selection imageFilePath = dataUri.toString()
val dataUri = data.data Log.i("[Image Utils] Using data URI $imageFilePath")
if (dataUri != null) { } else if (temporaryImageFilePath?.exists() == true) {
imageFilePath = dataUri.toString() imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Using data URI $imageFilePath") Log.i("[Image Utils] Data URI is null, using $imageFilePath")
} else if (temporaryImageFilePath.exists()) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data URI is null, using $imageFilePath")
}
} }
} else if (temporaryImageFilePath.exists()) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data is null, using $imageFilePath")
} }
} else if (temporaryImageFilePath?.exists() == true) {
imageFilePath = temporaryImageFilePath.absolutePath
Log.i("[Image Utils] Data is null, using $imageFilePath")
} }
return cleanFilePath(imageFilePath) return cleanFilePath(imageFilePath)
} }