do not require the Camera permission on marshmallow+

This commit is contained in:
tibbi
2016-06-13 17:02:00 +02:00
parent 87a7ca6af4
commit 0c0983f460
3 changed files with 48 additions and 11 deletions

View File

@ -47,7 +47,7 @@ public class MainActivity extends AppCompatActivity implements MyCamera {
} }
private void setupCameraImpl() { private void setupCameraImpl() {
cameraImpl = new MyCameraImpl(this); cameraImpl = new MyCameraImpl(this, this);
cameraImpl.toggleFlashlight(); cameraImpl.toggleFlashlight();
} }

View File

@ -1,15 +1,24 @@
package com.simplemobiletools.flashlight; package com.simplemobiletools.flashlight;
import android.annotation.TargetApi;
import android.content.Context;
import android.hardware.Camera; import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.util.Log;
public class MyCameraImpl { public class MyCameraImpl {
private static final String TAG = MyCameraImpl.class.getSimpleName();
private Camera camera; private Camera camera;
private Camera.Parameters params; private Camera.Parameters params;
private boolean isFlashlightOn; private boolean isFlashlightOn;
private MyCamera callback; private MyCamera callback;
private Context context;
public MyCameraImpl(MyCamera camera) { public MyCameraImpl(MyCamera camera, Context cxt) {
callback = camera; callback = camera;
context = cxt;
setupCamera(); setupCamera();
} }
@ -25,6 +34,9 @@ public class MyCameraImpl {
} }
public void setupCamera() { public void setupCamera() {
if (isMarshmallow())
return;
if (camera == null) { if (camera == null) {
try { try {
camera = Camera.open(); camera = Camera.open();
@ -35,33 +47,58 @@ public class MyCameraImpl {
if (isFlashlightOn) if (isFlashlightOn)
enableFlashlight(); enableFlashlight();
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "setup camera " + e.getMessage());
callback.cameraUnavailable(); callback.cameraUnavailable();
} }
} }
} }
private void enableFlashlight() { private void enableFlashlight() {
if (isMarshmallow()) {
toggleMarshmallowFlashlight(true);
} else {
if (camera == null || params == null) if (camera == null || params == null)
return; return;
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(params); camera.setParameters(params);
}
callback.enableFlashlight(); callback.enableFlashlight();
} }
private void disableFlashlight() { private void disableFlashlight() {
if (isMarshmallow()) {
toggleMarshmallowFlashlight(false);
} else {
if (camera == null || params == null) if (camera == null || params == null)
return; return;
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(params); camera.setParameters(params);
}
callback.disableFlashlight(); callback.disableFlashlight();
} }
@TargetApi(Build.VERSION_CODES.M)
private void toggleMarshmallowFlashlight(boolean enable) {
try {
final CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
final String[] list = manager.getCameraIdList();
manager.setTorchMode(list[0], enable);
} catch (CameraAccessException e) {
Log.e(TAG, "toggle marshmallow flashlight " + e.getMessage());
callback.cameraUnavailable();
}
}
public void releaseCamera() { public void releaseCamera() {
if (camera != null) { if (camera != null) {
camera.release(); camera.release();
camera = null; camera = null;
} }
} }
private boolean isMarshmallow() {
return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M;
}
} }

View File

@ -37,7 +37,7 @@ public class MyWidgetProvider extends AppWidgetProvider implements MyCamera {
final PendingIntent pendingIntent = PendingIntent.getBroadcast(cxt, 0, intent, 0); final PendingIntent pendingIntent = PendingIntent.getBroadcast(cxt, 0, intent, 0);
remoteViews = new RemoteViews(cxt.getPackageName(), R.layout.widget); remoteViews = new RemoteViews(cxt.getPackageName(), R.layout.widget);
remoteViews.setOnClickPendingIntent(R.id.toggle_btn, pendingIntent); remoteViews.setOnClickPendingIntent(R.id.toggle_btn, pendingIntent);
cameraImpl = new MyCameraImpl(this); cameraImpl = new MyCameraImpl(this, cxt);
final Resources res = cxt.getResources(); final Resources res = cxt.getResources();
final int appColor = res.getColor(R.color.colorPrimary); final int appColor = res.getColor(R.color.colorPrimary);