Страницы

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

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

суббота, 8 февраля 2020 г.

OnTouchListener не работает

#android #camera #ontouchlistener


Не работает данный кусок кода, не могу понять почему.
sv- это SurfaceView, которое используется для отображения камеры(это для заметки).

sv.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
                if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                    Toast.makeText(MainActivity.this, "onTouch", Toast.LENGTH_SHORT).show();
                    return true;}}});

    


Ответы

Ответ 1



Попробуйте другое событие. sv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(View.getContext(), "Clicked", Toast.LENGTH_SHORT).show(); Log.v("W", "Clicked"); });

Ответ 2



Делал список на основе ListView. Нужны были свайпы, скрол и *синглтачи*. Не хотелось использовать или кастомить никакие GestureDetector-ы. Но одновременное вешание нескольких *листенеров* на одну вьюху заканчивалось только тем что приходилось делать костыли которые намного тяжелее чем любой GestureDetector. Потому, пришлось повесить на вьюху OnTouchListener, из метода onTouch передавать событие касания в GestureDetectorCompat, и уже в его методе onScroll реализовал саму логику *свайпа*. *Синглтачи* обрабатывал средствами того же `GestureDetectorCompat.

пятница, 24 января 2020 г.

Самый простой способ получить bitmap с камеры на c#

#c_sharp #camera #directshow


Единственное, что нашел - это библиотека AFORGE.net с сэмплом SNAPSHOT MAKER.
Но там реализовано и потоковое видео в контрол, и снятие битмапа, в общем очень богатый
функционал, который мне в корне не понадобится. Мне нужен только битмап(причем задержка
между съемками более минуты), может есть более грациозное решение для получения его
с камеры?
    


Ответы

Ответ 1



Если не тащить громоздкие библиотеки вроде AForge.NET (которая все равно использует DirectShow API в примере из параллельного ответа), можно ограничиться библиотекой попроще DirectShow.NET, в которой есть по меньшей мере два близких примера: \DirectShowSamples-2010-February\Samples\Misc\DxWebCam A poor man's web cam program. This application runs as a Win32 Service. It takes the output of a capture graph, turns it into a stream of JPEG files, and sends it thru TCP/IP to a client application. \DirectShowSamples-2010-February\Samples\Capture\DxSnap Use DirectShow to take snapshots from the Still pin of a capture device. Note the MS encourages you to use WIA for this, but if you want to do in with DirectShow and C#, here's how. Note that this sample will only work with devices that output uncompressed video as RBG24. This will include most webcams, but probably zero tv tuners. В обоих случаях происходит примерно похожее: инициализация захвата видео с камеры и дальнейшая работа с кадрами (далее с видео - по вкусу: пропуск ненужного, обработка нужного). Нужно иметь в виду следующее: у веб-камер есть нередко неприятная особенность долго начинать работу (инициализация, фокусировка и настройка баланса белого и пр.). То есть для моментального снимка нужно все время снимать и выбрасывать ненужные кадры, далее по сигналу схватить первый попавшийся (или последний имеющийся) кадр.

Ответ 2



Посмотрите вот это решение MJPEG Decoder оно более легкое по перфе. Нет ничего лишнего. Ушел с Aforge на него. Так же открыт исходный код для исследования. UPD Либо, как советуют люди, вот так var sourceURL = "http://192.168.137.23/cgi-bin/viewer/video.jpg"; var buffer = new byte[100000]; int read, total = 0; var req = (HttpWebRequest)WebRequest.Create(sourceURL); var resp = req.GetResponse(); var stream = resp.GetResponseStream(); while (stream != null && (read = stream.Read(buffer, total, 1000)) != 0) total += read; pictureBox1.Image = (Bitmap)Image.FromStream(new MemoryStream(buffer, 0, total)); sourceURL - зависит от камеры, по какому пути она отдает одиночный jpg

Ответ 3



Используя Aforge сделал следующим образом. (Snapshot,почему-то не срабатывало событие trigger камеры) public class VideoGrabber { VideoCaptureDevice videoSource; Bitmap b = null; public bool isRunning = false; public Bitmap takeSnapshot() { isRunning = true; b = null; videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame); while (b == null) System.Threading.Thread.Sleep(1); videoSource.NewFrame -= new AForge.Video.NewFrameEventHandler(videoSource_NewFrame); isRunning = false; return b; } public VideoGrabber() { FilterInfoCollection videosources = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videosources != null) { videoSource = new VideoCaptureDevice(videosources[0].MonikerString); try { if (videoSource.VideoCapabilities.Length > 0) { string highestSolution = "0;0"; for (int i = 0; i < videoSource.VideoCapabilities.Length; i++) { if (videoSource.VideoCapabilities[i].FrameSize.Width > Convert.ToInt32(highestSolution.Split(';')[0])) highestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + ";" + i.ToString(); } videoSource.VideoResolution = videoSource.VideoCapabilities[Convert.ToInt32(highestSolution.Split(';')[1])]; } videoSource.Start(); } catch { } } } void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { b = (Bitmap)eventArgs.Frame.Clone(); } public void Dispose() { if (videoSource != null && videoSource.IsRunning) { videoSource.SignalToStop(); videoSource = null; } } } Снимок получаю за 1-3 секунды. Хотелось бы снимок за 100-300 мс.

среда, 22 января 2020 г.

Как организовать мигание вспышки

#android_sdk #camera #eclipse #android


Именю такой код, для включения вспышки
mCamera = Camera.open();
Camera.Parameters params = mCamera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);

И такой для выключения
Camera.Parameters params = mCamera.getParameters();
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
mCamera.release();
mCamera = null;

Как организовать мигание вспышки по нажатию ToggleButton. То есть, есть ToggleButton
ON то вспышка мигает, а если OFF то останавливается.
PS. Работать с ToggleButton умею, нужет только код, запускающий мигание.    


Ответы

Ответ 1



Собственно, вот рабочий код. Есть маленький нюанс. Если нажать на кнопку в момент, когда вспышка будет гореть, то она так и останется гореть. Кто захочет, добавит дополнительную проверку или выключение вспышки по завершению цикла. Итак, первым делом обязательно добавляем в файл манифеста строки о доступе к камере и вспышке. По условиям вопроса я добавил на слой простую ToggleButton. Её id - btn_switch . Всё, дальше можно копировать код в своё Activity и наслаждаться морганием. package com.blogspot.leved_notes.blinker; import android.app.Activity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.Toast; import android.widget.ToggleButton; public class MainActivity extends Activity implements OnCheckedChangeListener { ToggleButton mSwitcher; private Camera mCamera; private Parameters mParams; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSwitcher = (ToggleButton) findViewById(R.id.btn_switch); mSwitcher.setOnCheckedChangeListener(this); if (!checkCameraHardware()) gameOver(); mCamera = getCameraInstance(); checkFlash(); } @Override public void finish() { super.finish(); if (mCamera != null) mCamera.release(); } @Override public void onCheckedChanged(CompoundButton btn, boolean state) { if (state) { Thread thread = new Thread(new Runnable() { @Override public void run() { if (mCamera != null) { while (mSwitcher.isChecked()) { String mode = mParams.getFlashMode(); if (mode.equals(Parameters.FLASH_MODE_OFF)) mode = Parameters.FLASH_MODE_TORCH; else mode = Parameters.FLASH_MODE_OFF; mParams.setFlashMode(mode); mCamera.setParameters(mParams); try { Thread.sleep(500L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); thread.start(); } } /** Check if this device has a camera */ private boolean checkCameraHardware() { boolean result = false; PackageManager pm = getPackageManager(); if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) && pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) { // this device has a camera and flash result = true; } else gameOver(); return result; } private void gameOver() { finish(); Toast.makeText(this, "Error!", Toast.LENGTH_LONG).show(); } /** A safe way to get an instance of the Camera object. */ public Camera getCameraInstance() { CameraInfo info = new CameraInfo(); Camera c = null; for (int i = 0; i < Camera.getNumberOfCameras(); i++) { Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_BACK) { try { c = Camera.open(i); // attempt to get a Camera instance } catch (Exception e) { e.printStackTrace(); } } } return c; // returns null if camera is unavailable } private void checkFlash() { if (mCamera != null) { mParams = mCamera.getParameters(); } else gameOver(); } }

воскресенье, 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); } }

воскресенье, 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(); - в манифест

понедельник, 15 июля 2019 г.

Зачем нужно знать список доступных разрешений при работе с Camera2API?

Разбираю пример по работе с камерой и наткнулся на метод который возвращает список доступных разрешений
Size[] sizesJPEG = configurationMap.getOutputSizes(ImageFormat.JPEG);
for (Size item : sizesJPEG) { System.out.println("w:" + item.getWidth() + " h:" + item.getHeight()); }
и на выходе вот так
I/System.out: w:640 h:480 I/System.out: w:352 h:288 I/System.out: w:320 h:240 I/System.out: w:176 h:144
кто работал с камерой скажите для чего нам может понадобиться эта информация?


Ответ

Очевидно, что эта информация может понадобиться для того, чтобы узнать, какие доступны разрешения. Если вам, в конкретном приложении, не требуется данная информация, то вы не будете запрашивать ее, если же такая информация вам вдруг понадобится, для любых целей, то вы знаете где ее взять.
Практический момент может быть в том, чтобы, например, узнать, поддерживает ли камера съемку в JPEG вообще, то есть, если ни одного разрешения не вернул метод, то в JPEG камера не снимает. Потом, вы можете предложить пользователю выбрать собственные настройки, в каком разрешении снимать - чтобы он не натыкал там чего отсебятины при съемке, когда либо качество слишком низкое, либо слишком высокое, либо аспект не подходящий для фото, которе требуется в вашем приложении. Данный метод может пригодиться как тем, что поможет вывести, собственно, список доступных вариантов, так и тем, чтобы проверить, есть ли такое разрешение, если, скажем, у вас фиксированный список для всех устройств, но, как вы знаете, не все разрешения поддерживаются всеми камерами. Так же можно скомбинировать оба варианта и на основе полученной информации о разрешениях конкретной камеры,сформировать список из желаемых вами возможностей выбора в настройках (например, только широкоформатные) с теми, которые поддерживает именно эта камера.
Затем вы устанавливаете фиксированное разрешение, точно зная, что камера такое поддерживает.
Или вы можете получить эту информацию, чтобы установить размеры виджета для вывода снятого, точно по размерам фото.
Вообще, всевозможные API содержат большое количество классов и методов, многие из которых вам могут никогда не понадобиться и вы не будете ими пользоваться, так как для решения именно вашей задачи они не требуются - это вполне нормально. Наличие каких-то функций в API не подразумевает их непременного использования, особенно если вам трудно придумать, как именно их можно было бы использовать.
Не стоит на этом зацикливаться. Хорошо, что вы знаете, что такая возможность есть и когда-нибудь она и сможет вам пригодится. Если вы не знаете, как бы можно было использовать эту информацию, значит лично вам она в данном проекте не нужна. Оставьте ее в покое и решайте, те проблемы, которые требует текущий проект.
Если вам очень интересно, кто, как, где и для чего использует этот метод, вы можете посмотреть проекты, где он используется и сделать для себя какие то выводы.

среда, 10 июля 2019 г.

Фотография с камеры из android.app.Service

Я создаю приложение, которое из Service делает фотографию с задней камеры телефона. Но во время выполнения у меня вылетает исключение:
java.lang.RuntimeException: Fail to connect to camera service
Вот исходный код моего Service
@SuppressWarnings("deprecation") public class I2 extends Service {
byte[] i1;
@Override public IBinder onBind(Intent i1) { return null; }
@Override public void onStart(Intent i1, int i2) { new Thread(new i1()).start(); return; }
private class i1 implements Runnable {
private byte[] i1 = null;
@Override public void run() { while (true) { try { Camera i1 = Camera.open(); i1.setPreviewDisplay(new SurfaceView(I2.this).getHolder()); i1.startPreview(); i1.takePicture(null, null, new PictureCallback() {
@Override public void onPictureTaken(byte[] i1, Camera i2) { I2.this.i1 = i1; //получаю byte картинки i2.stopPreview(); i2.release(); }
}); } catch (Exception e1) { Log.v("", "lnp_ " + e1.toString()); } try { Thread.sleep(10000); } catch (InterruptedException e1) { } } }
}
}
В файле AndroidManifest.xml разрешение на камеру добавил:

В интернете нашёл примеры проектов работы с камерой и нашёл следующее: https://examples.javacodegeeks.com/android/core/hardware/camera-hardware/android-camera-example/ но всё-равно та же самая ошибка! Подскажите, как её исправить?


Ответ

Перед тем, как получать доступ камере, и уж тем более фотографировать, необходимо вот эту строчку вписать:
Camera.getNumberOfCameras();
Спасибо пользователю @Yura Ivanov.

Если программируете на эмуляторе Android версии 5.0 и выше, то, надо зайти в Настройки -> Приложения -> "Имя Вашего приложения" -> Разрешения -> Camera поставить галочку

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

Raw-image с камеры

Собственно вопрос: удавалось ли кому-то (как-то) вытащить из камеры на Андроид-девайсе картинку в RAW? Много гуглил, но как-то бесполезно. Пишут, что нельзя, хотя коллбеки для этого есть (которые null возвращают). Но быть может есть способ?


Ответ

Для тех кому интересно. Мысли такие. Вообщем, ситуация такая: самой ОС отдача RAW-картинки предусмотрена в коллбеке, а вот вендоры такую возможность для камер смартфонов не предусматривают. Это сделано специально, так как: смартфон - не фотоаппарат и нефиг Raw кушает очень много памяти, а ее обычно и так немного Есть еще превью-коллбек, в котором тоже крутится якобы raw и можно попробовать вытащить его оттуда, но чую там также не все так просто. Да и задача была делать фотку в raw.

суббота, 9 марта 2019 г.

Как организовать мигание вспышки

Именю такой код, для включения вспышки mCamera = Camera.open(); Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(params); И такой для выключения Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); mCamera.release(); mCamera = null; Как организовать мигание вспышки по нажатию ToggleButton. То есть, есть ToggleButton ON то вспышка мигает, а если OFF то останавливается. PS. Работать с ToggleButton умею, нужет только код, запускающий мигание.


Ответ

Собственно, вот рабочий код. Есть маленький нюанс. Если нажать на кнопку в момент, когда вспышка будет гореть, то она так и останется гореть. Кто захочет, добавит дополнительную проверку или выключение вспышки по завершению цикла. Итак, первым делом обязательно добавляем в файл манифеста строки о доступе к камере и вспышке. По условиям вопроса я добавил на слой простую ToggleButton. Её id - btn_switch . Всё, дальше можно копировать код в своё Activity и наслаждаться морганием. package com.blogspot.leved_notes.blinker;
import android.app.Activity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.Toast; import android.widget.ToggleButton;
public class MainActivity extends Activity implements OnCheckedChangeListener {
ToggleButton mSwitcher; private Camera mCamera; private Parameters mParams;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mSwitcher = (ToggleButton) findViewById(R.id.btn_switch); mSwitcher.setOnCheckedChangeListener(this);
if (!checkCameraHardware()) gameOver();
mCamera = getCameraInstance(); checkFlash(); }
@Override public void finish() { super.finish(); if (mCamera != null) mCamera.release(); }
@Override public void onCheckedChanged(CompoundButton btn, boolean state) { if (state) { Thread thread = new Thread(new Runnable() {
@Override public void run() { if (mCamera != null) { while (mSwitcher.isChecked()) { String mode = mParams.getFlashMode(); if (mode.equals(Parameters.FLASH_MODE_OFF)) mode = Parameters.FLASH_MODE_TORCH; else mode = Parameters.FLASH_MODE_OFF;
mParams.setFlashMode(mode); mCamera.setParameters(mParams); try { Thread.sleep(500L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); thread.start(); } }
/** Check if this device has a camera */ private boolean checkCameraHardware() { boolean result = false; PackageManager pm = getPackageManager(); if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) && pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) { // this device has a camera and flash result = true; } else gameOver();
return result; }
private void gameOver() { finish(); Toast.makeText(this, "Error!", Toast.LENGTH_LONG).show(); }
/** A safe way to get an instance of the Camera object. */ public Camera getCameraInstance() { CameraInfo info = new CameraInfo(); Camera c = null;
for (int i = 0; i < Camera.getNumberOfCameras(); i++) { Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_BACK) { try { c = Camera.open(i); // attempt to get a Camera instance } catch (Exception e) { e.printStackTrace(); } } }
return c; // returns null if camera is unavailable }
private void checkFlash() { if (mCamera != null) { mParams = mCamera.getParameters(); } else gameOver(); }
}

среда, 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); } }