studio picture intent getdata from example data android android-camera-intent

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.