web-dev-qa-db-fra.com

Appareil photo Android et objectif du sélecteur de photos

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.

4
Igor Janković

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!

3
Igor Janković

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);
4
muazzam abbas
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);
1
Nirmit