Android 6.0+要求顯式用戶授權且**前台可見**才能使用相機。後台靜默拍照需繞過此限制。
Service,類型TYPE_APPLICATION_OVERLAY(Android 8.0+)或TYPE_SYSTEM_ALERT(舊版)。View(或極小SurfaceView)到WindowManager。Service中啟動Camera/Camera2拍照,無預覽或預覽設置為懸浮窗Surface。public class CameraService extends Service {
private WindowManager wm;
private View floatView;
@Override
public void onCreate() {
super.onCreate();
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
floatView = new View(this);
floatView.setBackgroundColor(Color.TRANSPARENT);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
1, 1, // 1x1像素
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSPARENT);
params.gravity = Gravity.START | Gravity.TOP;
wm.addView(floatView, params);
// 啟動相機拍照邏輯
startCameraCapture();
}
@Override
public void onDestroy() {
if (floatView != null) wm.removeView(floatView);
super.onDestroy();
}
}
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 懸浮窗 -->
<uses-feature android:name="android.hardware.camera" android:required="true" />
REQUEST_COMPANION_RUN_IN_BACKGROUND等豁免。startForeground顯示通知「正在拍照」,用戶可見可控。ProcessCameraProvider配合LifecycleOwner正規生命周期管理。