Обнаружение передней или задней камеры в намерении камеры Android

Я хочу получить изображение, сделав фото. Но я получаю зеркальное изображение (повернутое), когда использую фронтальную камеру, поэтому я попытался повернуть его с помощью этого кода.

bitmap = rotateImage(bitmap, 270);

Но это также повернёт заднюю камеру. Итак, как я могу обнаружить это с помощью передней или задней камеры?

Проверьте, какая камера открыта спереди или сзади Android

Я провел небольшое исследование и нашел этот вопрос. но cameraInfo устарела, и где мне разместить информацию о камере? selectImage () или onActivityResult?

private void selectImage() {
    try {
        PackageManager pm = context.getPackageManager();
        int hasPerm = pm.checkPermission(Manifest.permission.CAMERA, context.getPackageName());
        if (hasPerm == PackageManager.PERMISSION_GRANTED) {
            final CharSequence[] options = {"Take Photo", "Choose From Gallery","Cancel"};
            android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
            builder.setTitle("Select Option");
            builder.setItems(options, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (options[item].equals("Take Photo")) {
                        dialog.dismiss();
                        dispatchTakePictureIntent();
                    }
                }
            });
            builder.show();
        } else
            ..
    } catch (Exception e) {
        ...
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    inputStreamImg = null;

    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        PackageManager pm = context.getPackageManager();
        int hasPerm = pm.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, context.getPackageName());
        if (hasPerm == PackageManager.PERMISSION_GRANTED) {

            Uri mUri = null;
            galleryAddPic();
            setPic();

            bitmap = rotateImage(bitmap, 270);
            mUri = getImageUri(getContext(), bitmap);

            goProgressDetailPage(mUri.toString());
        }else{
            ActivityCompat.requestPermissions(getActivity(), new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        }
    }
}

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Log.d("EEERR", ex.getLocalizedMessage());
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(getContext(),
                    "sweat.com.xover.my.sweat.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

private File createImageFile() throws IOException {
    //copy from https://developer.android.com/training/camera/photobasics
}

private void galleryAddPic() {
    //copy from https://developer.android.com/training/camera/photobasics
}

private void setPic() {
    //copy from https://developer.android.com/training/camera/photobasics
}

private Bitmap imageOreintationValidator(Bitmap bitmap, String path) {

    ExifInterface ei;
    try {
        ei = new ExifInterface(path);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                bitmap = rotateImage(bitmap, 90);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                bitmap = rotateImage(bitmap, 180);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                bitmap = rotateImage(bitmap, 270);
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return bitmap;
}

private Bitmap rotateImage(Bitmap source, float angle) {

    Bitmap bitmap = null;
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    try {
        bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                matrix, true);
    } catch (OutOfMemoryError err) {
        err.printStackTrace();
    }
    return bitmap;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 239
1

Ответы 1

Вы можете использовать Camera2 API для поиска фронтальной камеры для этого вы можете попробовать этот код

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
        try {
            return manager.getCameraIdList();
        } catch (CameraAccessException e) {
            return null;
        }

найти фронтальную камеру с id

CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId);

    if (cameraCharacteristics == null)
        throw new NullPointerException("No camera with id " + cameraId);

    return cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;

Затем после того, как вы должны установить идентификатор камеры

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
   try {
     characteristics = manager.getCameraCharacteristics(mCameraId);
     Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
     if (facing != null && facing ==
    CameraCharacteristics.LENS_FACING_FRONT) {
         //call your method to rotate camera
}
 }  catch (CameraAccessException e) {
   e.printStackTrace();
 }

Note : cameraId 0 for back and 1 for front

cameraId = manager.getCameraIdList()[1];

надеюсь, это поможет

Как я могу вписать этот код в текущий код или мне нужно удалить текущий код?

Lester 13.09.2018 07:42

В чем разница API Camera2 и моего текущего кода? кастомные и дефолтные? потому что это похоже на другой метод. Камера 2 должна создать макет для камеры, мой текущий код не нужен.

Lester 13.09.2018 07:54

в настоящее время вы пытаетесь открыть намерение приложения камеры ... но в camera2 api вам не нужно перенаправлять пользователя в приложение камеры

Rj_Innocent_Coder 13.09.2018 07:56

Я предлагаю вам использовать camera2 api. просто поместите две кнопки спереди и сзади, затем нажмите кнопку открытия камеры в своем приложении

Rj_Innocent_Coder 13.09.2018 07:58

это решит вашу проблему, а также вашим кодом будет управлять с помощью последней версии camera2 api

Rj_Innocent_Coder 13.09.2018 07:59

Другие вопросы по теме