Je construis l'application Android dont l'une des fonctionnalités sera de prendre la photo de la galerie ou de la caméra. J'ai du mal à le faire fonctionner avec tous les appareils. Je ne trouve pas la solution adaptée à chaque version Android et à chaque appareil. J'ai l'impression d'avoir cherché sur Internet et essayé tous les codes que j'ai trouvés, mais sans succès, pour que tout fonctionne. J'ai essayé d'implémenter le code de la documentation officielle d'Android mais le même problème. Choisir dans la galerie semble fonctionner, mais la caméra ne fonctionne pas bien du tout. Quelqu'un pourrait-il me donner le conseil, le lien ou le code, comment le faire? J'ai littéralement perdu la nervosité en essayant de faire ça. Je suis assez nouveau dans Android ...
J'ai besoin des deux intentions, pour la galerie et la caméra.
Au bout d'environ six mois, j'ai trouvé une solution. En fait, j'ai trouvé une bibliothèque qui fonctionne avec tous les téléphones et toutes les versions d'Android. Si encore quelqu'un a besoin d'une solution pour cela, voici une réponse.
EasyImage a fait le travail!
Vous pouvez faire quelque chose comme ça,
private static final int PICK_FROM_CAMERA = 1;
private static final int PICK_FROM_GALLARY = 2;
Uri outPutfileUri;
// Pour la durée d'exécution, comme dans Marshmallow os
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//Define Button in the Xml file and get them
Button galleryButton= (Button)findViewById(R.id.gallerybutton);
Button cameraButton= (Button)findViewById(R.id.camerabutton);
//Listener's on the button
galleryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent galleryIntent = new Intent(Intent.ACTION_PICK, Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// Start the Intent
startActivityForResult(galleryIntent, PICK_FROM_GALLARY);
}
});
cameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Camera permission required for Marshmallow version
// permission has been granted, continue as usual
Intent captureIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(), "MyPhoto.jpg");
outPutfileUri = Uri.fromFile(file);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutfileUri);
startActivityForResult(captureIntent, PICK_FROM_CAMERA);
}
}
});
Ensuite, sur ActivityResult, vous obtiendrez l'image
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICK_FROM_CAMERA:
if (resultCode == Activity.RESULT_OK) {
//pic coming from camera
Bitmap bitmap=null;
try {
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), outPutfileUri);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case PICK_FROM_GALLARY:
if (resultCode == Activity.RESULT_OK) {
//pick image from gallery
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
// Get the cursor
Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
// Move to first row
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String imgDecodableString = cursor.getString(columnIndex);
cursor.close();
bitmap = BitmapFactory.decodeFile(imgDecodableString);
}
break;
}
}
// Pour périphérique Guimauve
cameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Camera permission required for Marshmallow version
if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Callback onRequestPermissionsResult interceptadona Activity MainActivity
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, PICK_FROM_CAMERA);
} else {
// permission has been granted, continue as usual
Intent captureIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(captureIntent, PICK_FROM_CAMERA);
}
}
});
//Gallery storage permission required for Marshmallow version
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so Prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
// Pour Android 7.0, vous pouvez faire quelque chose comme ça
ContentValues values = new ContentValues(1);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
outPutfileUri = getActivity().getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutfileUri);
startActivityForResult(captureIntent, PICK_FROM_CAMERA);
public String getPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, "", null, "");
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if (resultCode == getActivity().RESULT_OK) {
if (requestCode == 200) {
Uri selectedImageUri = imageReturnedIntent.getData();
if (null != selectedImageUri) {
String path = getPathFromURI(selectedImageUri);
DrawerAdapter.imageViewPP.setImageURI(selectedImageUri);
}
}else if(requestCode==0){
Uri selectedImageUri = imageReturnedIntent.getData();
if (null != selectedImageUri) {
String path = getPathFromURI(selectedImageUri);
//DrawerAdapter.imageViewPP.setImageURI(selectedImageUri);
}
}
}
}
public String getPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, "", null, "");
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}
Intent intent1 = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), 200);
Intent intent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);