カメラから写真を撮るために働くことができたコードは、アクティビティから実行されます。私は、サービス内から、またはサービスによって起動されたAsyncTaskから写真を撮ることができることはかなり確信しています。Android:UIなしのサービスからカメラで写真を撮ることは可能ですか?
カメラAPIには、UIに結びつけられているSurfaceViewが必要です。たぶん私は間違っています。写真をサービスから撮ることができるコードを書いた人はいますか?
カメラから写真を撮るために働くことができたコードは、アクティビティから実行されます。私は、サービス内から、またはサービスによって起動されたAsyncTaskから写真を撮ることができることはかなり確信しています。Android:UIなしのサービスからカメラで写真を撮ることは可能ですか?
カメラAPIには、UIに結びつけられているSurfaceViewが必要です。たぶん私は間違っています。写真をサービスから撮ることができるコードを書いた人はいますか?
カメラがプレビュー画面を必要とするため、これは可能ではないと思います。類似の質問を参照here
AndroidでWindowManager
を使用すると可能です。私が言うべき
https://stackoverflow.com/a/10268650/3047840
はい、あなたは写真を撮るためにSurfaceView
を必要とするが、それは、特定のXMLレイアウトに縛られる必要はありません。サービスでも動作するWindowManager
クラスに追加することができます。したがって、ここではWindowManager
はAndroidで浮動効果を実行するための 'ウィンドウ'を開きます。
具体的には、
あなたはWindowManager
にSurfaceView
を追加し、次のようにパラメータを設定することができます。
mPreview = new CameraPreview(this, mCamera, jpegCallback);
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.height = 1;
params.width = 1;
wm.addView(mPreview, params);
Androidはこの機能を備えていますが、iOSではありません。このため、iOSではなくAndroidのホーム画面でFacebookのチャットヘッドをアクティブにすることができます。
Show facebook like chat head from a broadcast receiver in android
あなたはまだ探しているなら、ここではいくつかのより完全なコードです。
private void takePhoto() {
System.out.println("Preparing to take photo");
Camera camera = null;
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
SystemClock.sleep(1000);
Camera.getCameraInfo(camIdx, cameraInfo);
try {
camera = Camera.open(camIdx);
} catch (RuntimeException e) {
System.out.println("Camera not available: " + camIdx);
camera = null;
//e.printStackTrace();
}
try{
if (null == camera) {
System.out.println("Could not get camera instance");
}else{
System.out.println("Got the camera, creating the dummy surface texture");
//SurfaceTexture dummySurfaceTextureF = new SurfaceTexture(0);
try {
//camera.setPreviewTexture(dummySurfaceTextureF);
camera.setPreviewTexture(new SurfaceTexture(0));
camera.startPreview();
} catch (Exception e) {
System.out.println("Could not set the surface preview texture");
e.printStackTrace();
}
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFileDir = getDir();
if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {
return;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
String date = dateFormat.format(new Date());
String photoFile = "PictureFront_" + "_" + date + ".jpg";
String filename = pictureFileDir.getPath() + File.separator + photoFile;
File mainPicture = new File(filename);
addImageFile(mainPicture);
try {
FileOutputStream fos = new FileOutputStream(mainPicture);
fos.write(data);
fos.close();
System.out.println("image saved");
} catch (Exception error) {
System.out.println("Image could not be saved");
}
camera.release();
}
});
}
}catch (Exception e){
camera.release();
}
}
あなたがリンクした質問に示されているように、*効果的に*プレビューなしで行うことができます。 – Sam
@グリッドメールどのようにユーザーの知識なしに写真を撮っているのですか? 。彼らは、写真を撮り、ダミーサーフェイスビュー/サーフェステクスチャを使用するサービスを開始しました。 https://play.google.com/store/apps/details?id=com.zenaapps.backgroundcameraどうすれば同じことができますか?コードサンプルがあれば提供できますか? –