Skip to content

Commit 0c0983f

Browse files
committed
do not require the Camera permission on marshmallow+
1 parent 87a7ca6 commit 0c0983f

File tree

3 files changed

+48
-11
lines changed

3 files changed

+48
-11
lines changed

app/src/main/java/com/simplemobiletools/flashlight/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
4747
}
4848

4949
private void setupCameraImpl() {
50-
cameraImpl = new MyCameraImpl(this);
50+
cameraImpl = new MyCameraImpl(this, this);
5151
cameraImpl.toggleFlashlight();
5252
}
5353

app/src/main/java/com/simplemobiletools/flashlight/MyCameraImpl.java

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package com.simplemobiletools.flashlight;
22

3+
import android.annotation.TargetApi;
4+
import android.content.Context;
35
import android.hardware.Camera;
6+
import android.hardware.camera2.CameraAccessException;
7+
import android.hardware.camera2.CameraManager;
8+
import android.os.Build;
9+
import android.util.Log;
410

511
public class MyCameraImpl {
12+
private static final String TAG = MyCameraImpl.class.getSimpleName();
613
private Camera camera;
714
private Camera.Parameters params;
815
private boolean isFlashlightOn;
916
private MyCamera callback;
17+
private Context context;
1018

11-
public MyCameraImpl(MyCamera camera) {
19+
public MyCameraImpl(MyCamera camera, Context cxt) {
1220
callback = camera;
21+
context = cxt;
1322
setupCamera();
1423
}
1524

@@ -25,6 +34,9 @@ public void toggleFlashlight() {
2534
}
2635

2736
public void setupCamera() {
37+
if (isMarshmallow())
38+
return;
39+
2840
if (camera == null) {
2941
try {
3042
camera = Camera.open();
@@ -35,33 +47,58 @@ public void setupCamera() {
3547
if (isFlashlightOn)
3648
enableFlashlight();
3749
} catch (Exception e) {
50+
Log.e(TAG, "setup camera " + e.getMessage());
3851
callback.cameraUnavailable();
3952
}
4053
}
4154
}
4255

4356
private void enableFlashlight() {
44-
if (camera == null || params == null)
45-
return;
57+
if (isMarshmallow()) {
58+
toggleMarshmallowFlashlight(true);
59+
} else {
60+
if (camera == null || params == null)
61+
return;
4662

47-
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
48-
camera.setParameters(params);
63+
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
64+
camera.setParameters(params);
65+
}
4966
callback.enableFlashlight();
5067
}
5168

5269
private void disableFlashlight() {
53-
if (camera == null || params == null)
54-
return;
70+
if (isMarshmallow()) {
71+
toggleMarshmallowFlashlight(false);
72+
} else {
73+
if (camera == null || params == null)
74+
return;
5575

56-
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
57-
camera.setParameters(params);
76+
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
77+
camera.setParameters(params);
78+
}
5879
callback.disableFlashlight();
5980
}
6081

82+
@TargetApi(Build.VERSION_CODES.M)
83+
private void toggleMarshmallowFlashlight(boolean enable) {
84+
try {
85+
final CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
86+
final String[] list = manager.getCameraIdList();
87+
manager.setTorchMode(list[0], enable);
88+
} catch (CameraAccessException e) {
89+
Log.e(TAG, "toggle marshmallow flashlight " + e.getMessage());
90+
callback.cameraUnavailable();
91+
}
92+
}
93+
6194
public void releaseCamera() {
6295
if (camera != null) {
6396
camera.release();
6497
camera = null;
6598
}
6699
}
100+
101+
private boolean isMarshmallow() {
102+
return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M;
103+
}
67104
}

app/src/main/java/com/simplemobiletools/flashlight/MyWidgetProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private void initVariables(Context context) {
3737
final PendingIntent pendingIntent = PendingIntent.getBroadcast(cxt, 0, intent, 0);
3838
remoteViews = new RemoteViews(cxt.getPackageName(), R.layout.widget);
3939
remoteViews.setOnClickPendingIntent(R.id.toggle_btn, pendingIntent);
40-
cameraImpl = new MyCameraImpl(this);
40+
cameraImpl = new MyCameraImpl(this, cxt);
4141

4242
final Resources res = cxt.getResources();
4343
final int appColor = res.getColor(R.color.colorPrimary);

0 commit comments

Comments
 (0)