Im usando el siguiente código de cámara en varias actividades y me gustaría hacer una clase que encapsula los métodos para el uso de la cámara en Android.
Lo que estoy tratando de conseguir es la clase Actividad ser algo como:
Public class Myfragment extends Fragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.profile_fragment, container, false);
mButtonProfilePhoto = v.findViewById(R.id.buttonProfilePhoto);
mButtonProfilePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Here I call the camera intent.
Camera.dispatchTakePictureIntent(getActivity(), mPhotoFile);
}
});
return v;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//handle the camera result
}
La clase de la cámara es como la siguiente:
public class Camera{
public static void dispatchTakePictureIntent(Activity activity, File file) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
// Create the File where the photo should go
file = null;
try {
file = Camera.createImageFile(activity);
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (file != null) {
Uri photoURI = FileProvider.getUriForFile(activity,
"com.itcom202.weroom.fileprovider",
file );
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult( takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
}
El problema que tengo ahora es que nunca consigo una llamada de vuelta onActivityResult
a partir del fragmento.
OS no tiene soporte para enviar onActivityResult()
a Fragment
's. Biblioteca de ayuda, sin embargo, tiene un mecanismo para hacer eso, que los registros de la llamada a una mesa especial en el AppCompatActivity
. El truco aquí es que usted tiene que utilizar Fragment
's propia startActivityForResult()
, no Activity
' s uno.
Por lo tanto, el Camera
código de la clase debe ser similar a:
public class Camera{
public static void dispatchTakePictureIntent(Activity activity, Fragment fragment, File file) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
// Create the File where the photo should go
file = null;
try {
file = Camera.createImageFile(activity);
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (file != null) {
Uri photoURI = FileProvider.getUriForFile(activity,
"com.itcom202.weroom.fileprovider",
file );
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
fragment.startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
}
Aviso última línea está utilizando Fragment
'sstartActivityForResult()