Камера: функция setDisplayOrientation не работает для Samsung Galaxy ACE с Android 2.3.6

Я пытался создать простую камеру для исследований. Я прочитал официальный документ камеры Android, а затем начал кодирование. поэтому я сделал несколько шагов, чтобы заставить его работать

1.Добавлены необходимые разрешения для функции камеры в приложении.

2. заблокировал мою активность только в режиме ПОРТРЕТ.

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

3.Добавлено несколько обратных вызовов камеры, чтобы заставить мою камеру работать.

  • SurfaceHolder.Callback,
  • Camera.PreviewCallback
  • AutoFocusCallback
  • ShutterCallback
  • PictureCallback для данных изображения RAW
  • PictureCallback для данных изображения JPG

4. В методе surfaceChanged я настраиваю настройки камеры. и до сих пор я работал над этим почти для всех устройств Android

  • LG
  • пряность
  • Samsung
  • HTC
  • Micromax
  • Sony
  • Motorola
  • Серия Google Nexus.

Но затем я протестировал на Samsung Galaxy ACE с Android версии 2.3.6 и обнаружил, что предварительный просмотр камеры повернут в альбомный режим.

Поэтому, после того, как я поставил точки логарифма / перерыва, я узнал, что ниже методы не работают для этой конкретной модели

//This method is not working for Samsung Galaxy ACE camera.setDisplayOrientation(90); //or parameters.set("orientation", "portrait"); //or parameters.setRotation(90); 

Примечание. Я охотился на множество решений по Google и SO, но пока не получилось удачи в этом

  • Issus сообщил здесь
  • ориентация поверхности камеры для Android
  • Android-порт заблокирован Просмотр камеры
  • Android – предварительный просмотр камеры в боковом направлении
  • Камера Android вращается
  • Android: просмотр камеры повернуть
  • Как правильно настроить ориентацию камеры Android?

Для вашей справки Мой примерный код ниже

 @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { Log.v(TAG, "surfaceChanged get called"); if (previewing) { camera.stopPreview(); previewing = false; } if (camera != null) { try { Camera.Parameters parameters = camera.getParameters(); List sizes = parameters.getSupportedPictureSizes(); Camera.Size result = null; for (int i = 0; i < sizes.size(); i++) { result = (Size) sizes.get(i); Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); if (result.width == 640) { parameters.setPreviewSize(result.width, result.height);// 640*480 parameters.setPictureSize(result.width, result.height); } else { } } //**************************************************************// /* * Here is the logic I have added to Manage Camera Display Orientation * It checks Current Orientation and SDK and then rotate display to make it Portrait view. */ int currentSDKVersion = android.os.Build.VERSION.SDK_INT; Log.d(TAG, "currentVersion " + currentSDKVersion); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { if (currentSDKVersion != 7) { camera.setDisplayOrientation(90); parameters.setRotation(90); } else { parameters.setRotation(90); /* * params.set("orientation", "portrait"); * params.set("rotation",90); */ } } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { if (currentSDKVersion != 7) { camera.setDisplayOrientation(0); } else { parameters.set("orientation", "landscape"); parameters.set("rotation", 90); } } //**************************************************************// camera.setParameters(parameters); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); camera.autoFocus(myAutoFocusCallback); camera.setOneShotPreviewCallback(cameraPreviewCallback); previewing = true; } catch (IOException e) { e.printStackTrace(); } } } 

Моя активность камеры (MainActivity.java) Полный код:

 public class MainActivity extends Activity implements SurfaceHolder.Callback, OnClickListener { public static final String TAG = "CameraActivity"; private Context context = null; Camera camera = null; private SurfaceView surfaceView = null; private SurfaceHolder surfaceHolder = null; boolean previewing = false; private LayoutInflater controlInflater = null; private Button buttonTakePicture = null; //private TextView textViewResultInfo = null; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.v(TAG, "onCreate get called"); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //textViewResultInfo = (TextView) findViewById(R.id.textViewResultInfo); context = this; getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = (SurfaceView) findViewById(R.id.surfaceview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); controlInflater = LayoutInflater.from(getBaseContext()); View viewControl = controlInflater.inflate(R.layout.control, null); LayoutParams layoutParamsControl = new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); this.addContentView(viewControl, layoutParamsControl); buttonTakePicture = (Button) findViewById(R.id.takepicture); buttonTakePicture.setOnClickListener(this); } @Override public void surfaceCreated(SurfaceHolder arg0) { Log.v(TAG, "surfaceCreated get called"); camera = Camera.open(); if (camera != null) { try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); previewing = true; } catch (IOException e) { e.printStackTrace(); } } } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { Log.v(TAG, "surfaceChanged get called"); if (previewing) { camera.stopPreview(); previewing = false; } if (camera != null) { try { //new MainActivity().setCameraDisplayOrientation(); Camera.Parameters parameters = camera.getParameters(); // List focusModes = // parameters.getSupportedFocusModes(); // if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) // { // parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); // } List sizes = parameters.getSupportedPictureSizes(); Camera.Size result = null; for (int i = 0; i = Build.VERSION_CODES.HONEYCOMB_MR1; } } 

Редактировать : я опубликовал комментарий на форуме разработчиков, но ответа нет.

Пожалуйста!! У кого-то есть идея относительно этой проблемы.

Я был бы очень признателен за любое предложение.

Когда у меня была аналогичная проблема с оригинальной вкладкой Galaxy Tab 2.2.1, я смог ее решить, выполнив следующие действия:

 Camera.Parameters parameters = camera.getParameters(); parameters.set("orientation", "portrait"); parameters.setRotation(90); camera.setParameters(parameters); 

Тем не менее, похоже, что вы уже пробовали эту точную комбинацию, учитывая, что у вас есть идентичный (но прокомментированный) код выше. Однако, как у вас есть код прямо сейчас, Ace собирается обойти, где у вас есть код с комментариями из-за его уровня API (10). Попробуйте это прямо внутри этого блока:

 if (currentSDKVersion != 7) { } 

И дайте мне знать, если это сработает, пожалуйста. Благодаря!

Я тоже искал решение часами. Это действительно сумасшедший. Мое решение состояло в том, чтобы просто использовать предварительный просмотр камеры в ландшафтном режиме (в моем приложении для портрета) и замаскировать части предварительного просмотра, которые мне не нужны. Я сделал это, наложив верхнюю и нижнюю части своего полноэкранного предварительного просмотра на некоторые виды. Из-за этого вы должны обрезать фотографию, которую вы получаете с камеры, тогда КОТОРЫЕ РЕЗУЛЬТАТЫ В МЕНЬШЕЙ РЕЗОЛЮЦИИ. Для моего приложения это не проблема.

Теперь я полностью доволен своим решением – пользователи не видят разницы;

Я обработал камеру, написав код, который был главным образом адаптирован из проекта ZXing: http://code.google.com/p/zxing/

Вы можете попробовать их использовать. Если вы пытаетесь использовать это, я бы порекомендовал пройти через этот вопрос с использованием stackoverflow

Возможно, это не идеальное решение вашего вопроса, но я столкнулся с этой проблемой и решил использовать Zxing.

  • Одновременное использование обеих передних и задних камер
  • Как измерить высоту, ширину и расстояние объекта с помощью камеры?
  • Ионный 2: Кордова недоступна. Обязательно включите cordova.js или запустите в устройстве / симуляторе (работает в эмуляторе)
  • Автоматическая съемка без участия пользователя
  • Android: наложение на просмотр камеры Android
  • Съемка с камеры без предварительного просмотра
  • переключение назад / передняя камера на лету
  • Есть ли хороший учебник для внедрения приложения iPhone дополненной реальности?
  • Можно ли использовать переднюю и заднюю камеры одновременно в Android
  • Доступ к камере с iPhone SDK
  • objective камеры не работать с Samsung Galaxy S3
  • Давайте будем гением компьютера.