Luchando por intentar get una image de la camera para cargarla en Firebase – java.lang.IllegalStateException: uri no debe ser nulo

He estado leyendo todas las publicaciones aquí relacionadas (así como la documentation) sobre este tema y por alguna razón no puedo hacer que funcione. Llego al punto en que el usuario toma una foto, toca la marca de verificación para continuar y luego la aplicación falla.

Específicamente en esta línea:

val filepath = mFirebaseStorage.child("Users").child(prefs.UID).child(uri.lastPathSegment) 

Mi código se ve así:

onLaunchCamera : se llama cuando el usuario selecciona "Cámara" en el cuadro de alerta

 private fun onLaunchCamera() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) //Ensure there's a camera activity to handle the intent if (takePictureIntent.resolveActivity(packageManager) != null) { var photoFile: File? = null try { photoFile = createImageFile() } catch (e: IOException) { //log error Log.e(TAG, e.toString()) } //continue only if file was successfully created! if (photoFile != null) { val photoURI = FileProvider.getUriForFile(this, "com.android.projectrc.fileprovider", photoFile) takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } } } 

onActivityResult

 override protected fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { val progressDialog = indeterminateProgressDialog("Uploading...") progressDialog.show() Log.d(TAG,"URI:: ${photoURI}") val uri = data.data val filePath = mFirebaseStorage.child("Users").child(prefs.UID) .child("ProfileImage").child(uri.lastPathSegment) filePath.putFile(photoURI!!).addOnSuccessListener(OnSuccessListener <UploadTask.TaskSnapshot >() { fun onSuccess(taskSnapshot : UploadTask.TaskSnapshot) { toast("Upload Successful!") progressDialog.dismiss() } }).addOnFailureListener(OnFailureListener () { fun onFailure(e : Exception) { Log.e(TAG, e.toString()) toast("Upload Failed!") } }); //val bundle = data.extras } } 

createImageFile

 private fun createImageFile(): File { // Create an image file name val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US) val imageFileName = "JPEG_" + timeStamp + "_"; val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) val image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = image.absolutePath; return image } 

AndroidManifest.xml

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE" /> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.android.projectrc.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 

files_path.xml

 <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="Android/data/com.android.projectrc/files/Pictures" /> </paths> 

Incluso photoURI aparece nulo cuando la console lo emite. ¡Estoy bastante perdido y agradecería cualquier ayuda!

    La respuesta a esta pregunta relacionada explica que cuando un URI se pasa como EXTRA_OUTPUT en el bash ACTION_IMAGE_CAPTURE , el URI no se devuelve como datos en el parámetro de intención a onActivityResult() .

    Esto significa que debe save el URI en una variable de class cuando se genera para que esté disponible en onActivityResult() . Parece que ya tiene photoURI declarado como una variable de class y que tiene la intención de definir su valor con este código en onLaunchCamera() :

      val photoURI = FileProvider.getUriForFile(this, "com.android.projectrc.fileprovider", photoFile) 

    Pero el val está creando una nueva instancia de photoURI y el valor no se almacena en el campo de la class como lo desea. Eliminar val .