I am getting following error
Exception java.lang.RuntimeException: setParameters failed
android.hardware.Camera.native_setParameters (Camera.java)
android.hardware.Camera.setParameters (Camera.java:1946)
in code below. I have no clue what wrong i am doing below.
Camera mCamera = Camera.open();
Parameters params = mCamera.getParameters();
if (params.getFlashMode() != null)
params.setFlashMode(Parameters.FLASH_MODE_OFF);
if (nightMode && params.getSceneMode() != null)
params.setSceneMode(Parameters.SCENE_MODE_NIGHT);
if (params.getSupportedFocusModes().contains(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
params.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
} else if (params.getSupportedFocusModes().contains(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_INFINITY)) {
params.setFocusMode(Parameters.FOCUS_MODE_INFINITY);
}
mCamera.setParameters(params);
this error is occurring in some devices like samsung mostly.
Requesting for help.Thanks in advance.
Your params could be not supported by device. You can detect available focus modes with getSupportedFocusModes method of Camera.Parameters class. If some mode doesn't contain in this list, you can't set it to your camera.
Edit
As Alex said in comment you can see error message in logcat.
you must check if the focus mode supported by the user device, not all devices has camera focus mode, you do it like this:
public boolean support_focus(Camera camera){
Camera.Parameters parameters = camera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
return true;
else
return false;
}
this check if device support FOCUS_MODE_AUTO, change that with your desired Parameter.
Related
Problem happening on a Nokia 6 with Android 7.1.1
Permission granted
AppOpsManager#checkOp(AppOpsManager.OPSTR_CAMERA, Process.myUid(), getPackageName()) returns AppOpsManager#MODE_ALLOWED
Yet when trying Camera.open(i) for checking camera properties I get
I/CameraService: Camera 0: Access for "package" has been restricted
Apparently this could only happen [1] if application's package or uId has been explicitly restricted from starting AppOpsManager#OP_CAMERA.
But why would this happen? After AppOpsManager#checkOp says AppOpsManager#MODE_ALLOWED
Sample code
for (int i = 0; i < numCameras; ++i) {
List<Size> supportedSizes = null;
List<int[]> supportedFpsRanges = null;
Camera camera = null;
try {
camera = Camera.open(i);
Parameters parameters = camera.getParameters();
supportedSizes = parameters.getSupportedPreviewSizes();
supportedFpsRanges = getFpsRangesRobust(parameters);
} catch (Exception e) {
...
} finally {
if (camera != null) {
camera.release();
}
}
[1] https://github.com/aosp-mirror/platform_frameworks_base/blob/oreo-mr1-release/services/core/java/com/android/server/AppOpsService.java#L2588
Aparently it's a device issue.
Nokia 6 / TA-1000, Android 7.1.1
The scenario
try to use camera
app asks for permission, tap Deny
try to use camera
app asks for permission, tap Allow
Error posted in logcat, camera doesn't work
Is reproducible with any other application, including the default camera app.
Check you have added this line to your app manifest.
android:foregroundServiceType="camera"
I am using CameraManager and CameraCharacteristics
I would like to know how to check if the flashlight is turned on
Try this bit of code
public boolean FlashStatus() {
Camera.Parameters parameters = camera.getParameters();
return parameters.getFlashMode() == "FLASH_MODE_TORCH";
}
I am using following code to turn LED flashlight on and off:
public Flashlight(SurfaceView preview, Context context){
this.preview = preview;
this.context = context;
mHolder = preview.getHolder(); //mHolder is surfaceHolder
mHolder.addCallback(this);
try {
mCamera = Camera.open();
params = mCamera.getParameters();
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
//AUTOFOCUS LASER FIX ON LG G3
List<String> focusModes = params.getSupportedFocusModes();
if (focusModes.contains(params.FOCUS_MODE_INFINITY)) {
params.setFocusMode(params.FOCUS_MODE_INFINITY);
}
else{
if (focusModes.contains(params.FOCUS_MODE_FIXED))
params.setFocusMode(params.FOCUS_MODE_FIXED);
}
mCamera.setParameters(params);
cameraOpened = true;
}catch (Exception e){
cameraOpened = false;
e.printStackTrace();
}
}
private void turnOnFlashlight(){
flashlightOn = true;
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
}
private void turnOffFlashlight(){
flashlightOn = false;
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
}
It works great on most phones but I cant get it working on xperia Z5. I dont have Z5 for testing so I only know it from user response. So I would like to ask if there is any other (preferably working) way to turn on flashlight on Xperia Z5.
Thanks in forward
As already mentioned in the comment, I found there to be 3 steps of making the flash appear (seems to be working on all devices so far)
cam.setParameters(p); // will trigger flash on most devices
// Needed for some devices.
cam.setPreviewTexture(new SurfaceTexture(0));
// Needed for some more devices.
cam.startPreview();
Since you did 2 of those, try adding the PreviewTexture and it should work. The whole code of a working flashlight can be found here at Flashlight Widget
I was wondering if it's possible to set different camera parameters for front and back camera. If so, how to do it? If not, I was wondering if there was another solution for crashing when a device does not have one of the set parameters available, such as FLASH_MODE_ON or SCENE_HDR.
Use something like this to test support:
Parameters params = null;
if(mCamera != null) {
params = mCamera.getParameters();
if(params != null) {
List<String> supportedFlashModes = params.getSupportedFlashModes();
if(supportedFlashModes != null) {
if(supportedFlashModes.contains(Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode( Parameters.FLASH_MODE_TORCH );
} else if(supportedFlashModes.contains(Parameters.FLASH_MODE_ON)) {
params.setFlashMode( Parameters.FLASH_MODE_ON );
} else {}//no support for flash etc
}
}
How I check the flash light available on device?also want to know how can I On/Off the flash light?
I have put the code but not working right now?
I search out this
http://gitorious.org/rowboat/frameworks-base/commit/eb9cbb8fdddf4c887004b20b504083035d57a15f
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/com/android/server/LightsService.java#LightsService
Please can tell which I should use?
Thank You.
You can use the following
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
which will return true if a flash is available, false if not.
See http://developer.android.com/reference/android/content/pm/PackageManager.html for more information.
boolean hasFlash =this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
or
public boolean hasFlash() {
if (camera == null) {
return false;
}
Camera.Parameters parameters = camera.getParameters();
if (parameters.getFlashMode() == null) {
return false;
}
List<String> supportedFlashModes = parameters.getSupportedFlashModes();
if (supportedFlashModes == null || supportedFlashModes.isEmpty() || supportedFlashModes.size() == 1 && supportedFlashModes.get(0).equals(Camera.Parameters.FLASH_MODE_OFF)) {
return false;
}
return true;
}
First you get supported flash modes:
camera = Camera.open(i); // Introduced in API level 9
parameters = camera.getParameters();
String[] flashModes = parameters.getSupportedFlashModes();
And then you check if this array contains the correct constants like: "auto", "on", "off".
More info in:
http://developer.android.com/reference/android/hardware/Camera.Parameters.html#FLASH_MODE_AUTO
This can help full to turn on/off flash light of device. This is give me satisfaction, Hope be useful to you also.
Turn On camera Flash
camera = Camera.open();
Parameters p = camera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
camera.startPreview();
Turn Off camera Flash
camera = Camera.open();
Parameters p = camera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
camera.stopPreview();
Put this Permission in manifest file
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
For more detail you can go HERE.