在后台运行应用程序时尝试从前置摄像头捕获照片。
我在Android 6及更低版本中使用以下代码。
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++)
{
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
{
myCamera = Camera.open(camIdx);
}
}
仅当应用程序位于前台时,此功能才可在android 7及更高版本中使用。如果应用程序在后台运行,则会显示以下错误:
W/CameraBase: An error occurred while connecting to camera 1: Status(-8): '6: validateClientPermissionsLocked:915: Caller "packagename" (PID 10152, UID 32606) cannot open camera "1" from background'
W/System.err: java.lang.RuntimeException: Fail to connect to camera service
W/System.err: at android.hardware.Camera.<init>(Camera.java:546)
W/System.err: at android.hardware.Camera.open(Camera.java:392)
W/System.err: at com.tracking_smartphone.TakePictureActivity.takePictureNoPreview(TakePictureActivity.java:77)
W/System.err: at com.tracking_smartphone.TakePictureActivity.onCreate(TakePictureActivity.java:46)
W/System.err: at android.app.Activity.performCreate(Activity.java:7144)
W/System.err: at android.app.Activity.performCreate(Activity.java:7135)
W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2894)
W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3049)
W/System.err: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
W/System.err: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
W/System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err: at android.os.Looper.loop(Looper.java:193)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6680)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
在从JobService调用的Activity中调用代码。
答案 0 :(得分:1)
Android文档says:
前景服务要求-您的应用何时与相机互动?在Android 9(API级别28)及更高版本上,在后台运行的应用无法访问相机。因此,当您的应用程序位于前台或作为前台服务的一部分时,您应该使用相机。
因此,如果您希望能够在后台与摄像头进行交互,则需要通过所谓的“前台服务”进行操作,该服务本质上是一种后台服务,具有通知功能,可在活动时通知用户带有持久性通知。有关示例,请参见foreground service documentation。