picture - onactivityresult camera android
cámara android: el intento de onActivityResult() es nulo si tiene extras (4)
Después de buscar mucho en todos los temas relacionados en Stack Overflow y no encontrar nada, intente ayudarme.
Creé un intento para capturar una imagen. Luego vi un comportamiento diferente en onActivityResult()
: si no pongo ningún extra en el Intent (para pequeñas fotos), el Intent en onActivityResult está bien, pero cuando incluyo extras en el intento de escribir la imagen en un archivo, el ¡la intención en onActivityResult es null
!
La creación intencionada:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// without the following line the intent is ok
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(takePictureIntent, actionCode);
¿Por qué es nulo y cómo puedo resolverlo?
¿Dónde Uri.fromFile(f)
el f
para el Uri.fromFile(f)
?
Debe ser un objeto File
válido. Intenta crearlo antes de la línea EXTRA_OUTPUT
.
File f = new File("valid path");
Pruebe con algo como esto:
File file = new File(dataFile);
Uri outFileUri = Uri.fromFile(file);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, outFileUri);
startActivityForResult(intent, TAKE_PHOTO);
Me pasa lo mismo a mí, si está proporcionando MediaStore.EXTRA_OUTPUT
, entonces la intención es nula, pero tendrá la foto en el archivo que proporcionó ( Uri.fromFile(f)
).
Si no especifica MediaStore.EXTRA_OUTPUT
, tendrá una intención que contiene el uri del archivo donde la cámara ha guardado la foto.
No sé si es un error, pero funciona de esa manera.
EDITAR: Entonces en onActivityResult () ya no es necesario verificar los datos si nulo. Lo siguiente funcionó conmigo:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK_IMAGE_REQUEST://actionCode
if (resultCode == RESULT_OK && data != null && data.getData() != null) {
//For Image Gallery
}
return;
case CAPTURE_IMAGE_REQUEST://actionCode
if (resultCode == RESULT_OK) {
//For CAMERA
//You can use image PATH that you already created its file by the intent that launched the CAMERA (MediaStore.EXTRA_OUTPUT)
return;
}
}
}
Espero eso ayude
Una muestra escrita en Kotlin. Usted crea una aplicación Uri
para cámara, CameraFragment
retiene hasta que la cámara regrese de guardar su imagen y se la devuelve en onActivityResult
como era de esperar.
CameraFragment.kt
Actúa como intermediario entre el consumidor y la aplicación de la cámara. Toma Uri
como entrada y lo devuelve en Intent
datos.
class CameraFragment : Fragment() {
companion object {
val TAG = CameraFragment::class.java.simpleName
private val KEY_URI = ".URI"
fun newInstance(uri: Uri, targetFragment: Fragment, requestCode: Int): CameraFragment {
val args = Bundle()
args.putParcelable(KEY_URI, uri)
val fragment = CameraFragment()
fragment.arguments = args
fragment.setTargetFragment(targetFragment, requestCode)
return fragment
}
}
private lateinit var uri: Uri
private var fired = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
fired = savedInstanceState?.getBoolean("fired") ?: false
if (!fired) {
val args = arguments
uri = args.getParcelable(KEY_URI)
val i = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
i.putExtra(MediaStore.EXTRA_OUTPUT, uri)
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
context.grantUriPermission(i, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
startActivityForResult(i, targetRequestCode)
fired = true
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean("fired", fired)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == targetRequestCode) {
context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
val newData = Intent()
newData.data = uri
targetFragment.onActivityResult(requestCode, resultCode, newData)
dismiss()
}
}
private fun dismiss() {
fragmentManager.beginTransaction().remove(this).commit()
}
}
/** Grant Uri permissions for all camera apps. */
fun Context.grantUriPermission(intent: Intent, uri: Uri, modeFlags: Int) {
val resolvedIntentActivities = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (resolvedIntentInfo in resolvedIntentActivities) {
val packageName = resolvedIntentInfo.activityInfo.packageName;
grantUriPermission(packageName, uri, modeFlags);
}
}
Invocar la intención de la cámara
this
es un fragmento en su aplicación que activará la cámara. RC_CAMERA
es tu código de solicitud para esta acción.
val uri = /* Your output Uri. */
val f = CameraFragment.newInstance(uri, this, RC_CAMERA)
fragmentManager.beginTransaction().add(f, CameraFragment.TAG).commit()
Manejar el resultado de la cámara
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
RC_CAMERA -> {
if (resultCode == Activity.RESULT_OK) {
val uri = data?.data
// Do whatever you need.
}
}
}
}
usa lo siguiente:
Bitmap bitmap = data.getExtras (). GetParcelable ("datos");
funciona.