Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-camera. Показать все сообщения
Показаны сообщения с ярлыком android-camera. Показать все сообщения

воскресенье, 12 января 2020 г.

Как проверить количество света?

#java #android #camera #android_camera


Я работаю с Camera2API и мне нужно отключить возможность делать фото если на улице
не достаточно света... 

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

Если я правильно понимаю, то камера работает с каким то сенсором который определяет
количество света и если его не достаточно то вспышка работает.

Как подключиться к этому сенсору?
    


Ответы

Ответ 1



В итоге я воспользовался этой офф статьей И сделал так public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mPressure; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight= mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float luminosity = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); mSensorManager.unregisterListener(this); } }

воскресенье, 15 декабря 2019 г.

Реализовать возможность панорамной съемки

#android #android_sdk #android_camera


Здравствуйте, стоит задача реализации возможности съёмки панорамного фото в Android
приложении. Сейчас в приложении вызывается просто стандартная камера через intent.
Необходимо сделать свою имплементацию с возможностью отслеживания дрожания при съемке
и, при необходимости, сообщать об этом пользователю, и заставлять делать фото заново.
Подскажите, в какую сторону копать, искал инфу, говорят что такая возможность есть
только при условии наличия некоторых библиотек, которые устанавливаются вендором устройства,
но, везде их названия разные. Может есть какие сторонние библиотеки? В идеале, реализовать,
как на CyanogenMod 13 (ведётся камера из точки A в точку B, как при съемке видео) а
на выходе получается ровная, хорошего качества фотография без артефактов склеивания.
    


Ответы

Ответ 1



Очень интересная статья, может помочь в вашей ситуации.

Ответ 2



Я бы посоветовал выводить камеру на канвас через серфейс, подписаться на данные с датчиков и отслеживать поведение пользователя(дрожание и т.п.) Хорошая статья есть тут: maohao Вероятнее всего вам поможет git, например: https://github.com/zarelaky/panoramagl-android или https://github.com/ashqal/MD360Player4Android

воскресенье, 8 декабря 2019 г.

Почему приложение не видит permission (Android 6.0 Marshmallow)?

#java #android #camera #android_camera


Я работаю с Camera2API и использую для этого гугловский пример который на гите

Мистика вот в этом методе который и открывает камеру

private void openCamera(int width, int height) {
    setUpCameraOutputs(width, height);

    configureTransform(width, height);
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
            throw new RuntimeException("Time out waiting to lock camera opening.");

        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
                PackageManager.PERMISSION_GRANTED) {
            return;
        }

        manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);


    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
    }
}


Сейчас использую Samsung S6 android 6.0

Ожидается, что метод manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
- откроет камеру, но вместо это код останавливается в 

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
                PackageManager.PERMISSION_GRANTED) {
            return;
        }


насколько я понимаю, он не проходит проверку на permission, я проверил в манифесте
это и там есть нужный permission




Что это может означать?

Потом я попробовал открыть камеру на Meizu MX5 android 5.1 и все открывается и правильно
работает

Может ли проблема быть в версиях андроида?

Что я делаю не так? Как это можно проверить?
    


Ответы

Ответ 1



В android 6.0 изменились правила запроса разрешений теперь нужно запрашивать разрешения, а не просто прописать в manifest. Ссылка на документацию от google

Ответ 2



В итоге вот так все заработало, почитал офф статью и там действительно много изменений для 6-ки (кстати мне понравилось как все описано здесь), ну в общем согласно все нововедений собралось вот такое решение С формой реализации диалога запроса если ранее в пермишене было отказано public void camera(View view) { toCamera(); } private void toCamera() { if (!isCheckPermission()){ return; } if (isProcessWasFinish()) { startActivity(new Intent(getApplicationContext(), CameraActivity.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } else { startActivity(new Intent(getApplicationContext(), UserDataScreen.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } } private boolean isCheckPermission() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { showMessageOKCancel("You need to allow access to Camera"); return false; } // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); return false; // MY_PERMISSIONS_REQUEST is an // app-defined int constant. The callback method gets the // result of the request. } return true; } private void showMessageOKCancel(String message) { new AlertDialog.Builder(MainActivity.this) .setMessage(message) .setPositiveButton("OK", listener) .setNegativeButton("Cancel", listener) .create() .show(); } DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { final int BUTTON_NEGATIVE = -2; final int BUTTON_POSITIVE = -1; @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_NEGATIVE: // int which = -2 dialog.dismiss(); break; case BUTTON_POSITIVE: // int which = -1 ActivityCompat.requestPermissions( MainActivity.this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); dialog.dismiss(); break; } } }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e(MY_LOG, "Camera permission Granted"); // permission was granted, yay! Do the // contacts-related task you need to do. toCamera(); } else { Log.e(MY_LOG, "Camera permission Denied"); // permission denied, boo! Disable the // functionality that depends on this permission. } } default: { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } // other 'case' lines to check for other // permissions this app might request } }

Ответ 3



То, что вы разобрались, это очень хорошо. Но руками каждый раз проверять и запрашивать permission очень неудобно. Используйте готовые решения https://github.com/Karumi/Dexter

Ответ 4



http://easyrobot.online/temp/permission6.jar if(!AccessPermission.getPermmission(this)){ AccessPermission.setOnPermmissionResult(new OnPermmissionResult() { @Override public void OnPermmission(boolean access, String[] permissions, int[] grantResults) { if(access)init(); } }); }else init(); - в манифест

воскресенье, 24 ноября 2019 г.

Работа с камерой в Android


Для камеры есть коллбеки задания превью, получения картинки, но не понятно одно
у меня есть изображение в камере — делаю тач по какой-либо области — нужно получить область тача (цвет или хотя бы байты с данными).
Каким образом?

UPD:
Возникла проблема с получением картинки с канваса.
Делаем так:

Canvas canvas = mHolder.lockCanvas(mHolder.getSurfaceFrame());


А что дальше - непонятно.

Про канву можно забыть. Массив с изображением мы получаем из коллбека превьюшки для камеры, но получаем всегда null и нагугливаем этот вопрос.

Использую метод так:

Camera.Size camSize = camera.getParameters().getPictureSize();
int[] outBuff = new int[camSize.width * camSize.height];
decodeYUV(outBuff, data, camSize.width, camSize.height);
Log.d(TAG, "int[]=" + Arrays.toString(outBuff));


В лог ничего не выводится.

Итого:
Нужно по тачу в превью камеры получить область изображения (в байтах). То есть, делаем тач — получаем кусок картинки на которой был сделан тач.
    


Ответы

Ответ 1



Можно использовать YuvImage: @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Size previewSize = camera.getParameters().getPreviewSize(); YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Rect rect = new Rect(0, 0, previewSize.width, previewSize.height); yuvImage.compressToJpeg(rect, 100, baos); byte[] bytes = baos.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); // дальше можно получить область касания someImageView.setImageBitmap(Bitmap.createBitmap(bitmap, tapRegionX, tapRegionY, tapRegionWidth, tapRegionHeight)); }

среда, 6 марта 2019 г.

Как проверить количество света?

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


Ответ

В итоге я воспользовался этой офф статьей
И сделал так
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mPressure;
@Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
// Get an instance of the sensor service, and use that to get an instance of // a particular sensor. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight= mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); }
@Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. }
@Override public final void onSensorChanged(SensorEvent event) { float luminosity = event.values[0]; // Do something with this sensor data. }
@Override protected void onResume() { // Register a listener for the sensor. super.onResume(); mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); }
@Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); mSensorManager.unregisterListener(this); } }

пятница, 26 октября 2018 г.

Реализовать возможность панорамной съемки

Здравствуйте, стоит задача реализации возможности съёмки панорамного фото в Android приложении. Сейчас в приложении вызывается просто стандартная камера через intent. Необходимо сделать свою имплементацию с возможностью отслеживания дрожания при съемке и, при необходимости, сообщать об этом пользователю, и заставлять делать фото заново. Подскажите, в какую сторону копать, искал инфу, говорят что такая возможность есть только при условии наличия некоторых библиотек, которые устанавливаются вендором устройства, но, везде их названия разные. Может есть какие сторонние библиотеки? В идеале, реализовать, как на CyanogenMod 13 (ведётся камера из точки A в точку B, как при съемке видео) а на выходе получается ровная, хорошего качества фотография без артефактов склеивания.


Ответ

Очень интересная статья, может помочь в вашей ситуации.