Я хочу получить изображение, сделав фото. Но я получаю зеркальное изображение (повернутое), когда использую фронтальную камеру, поэтому я попытался повернуть его с помощью этого кода.
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;
}
Вы можете использовать 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];
надеюсь, это поможет
В чем разница API Camera2 и моего текущего кода? кастомные и дефолтные? потому что это похоже на другой метод. Камера 2 должна создать макет для камеры, мой текущий код не нужен.
в настоящее время вы пытаетесь открыть намерение приложения камеры ... но в camera2 api вам не нужно перенаправлять пользователя в приложение камеры
Я предлагаю вам использовать camera2 api. просто поместите две кнопки спереди и сзади, затем нажмите кнопку открытия камеры в своем приложении
это решит вашу проблему, а также вашим кодом будет управлять с помощью последней версии camera2 api
Как я могу вписать этот код в текущий код или мне нужно удалить текущий код?