私はシンプルなカメラ アプリ (SurfaceHolder を使用して、インターネットのさまざまなソースから) をプロトタイプとして作成し、後でより大きなプロジェクトに統合しました。
アプリは本当にうまく機能します。クラッシュせず、画像を適切に保存します。
私はそれをより大きなプロジェクトと統合し始めました。現在は、(メインのアクティビティではなく) 別のアクティビティから開始されています。期待どおりのカメラ ビューが表示され、クラッシュすることはありません。
ただし、撮影した写真は保存されません。
独立したカメラ アプリと統合されたカメラ アクティビティのコードは同じです。
私は、finish() を呼び出したり、他のアクティビティを開始したりせずに、統合されたカメラ コードをテストしました (画像が適切に出力されることを確認するためだけに)。
しかし、それでもうまくいきません。
誰もこれに遭遇しましたか?ありがとう。
これは、カメラ アクティビティのソース コードです。
public class CameraViewActivity extends Activity implements
SurfaceHolder.Callback, OnClickListener {
private static final String SD_CARD_LOC = "/sdcard/";
private static final String FILE_NAME = "image";
private static final String JPEG_FORMAT = ".jpg";
private static final String TAG = "CameraViewActivity";
private Context context = this;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
Camera camera;
boolean isPreviewRunning = false;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.e(TAG, "onCreate");
//Bundle extras = getIntent().getExtras();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.camera_view_layout);
surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
surfaceView.setOnClickListener(this);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageByteData, Camera c) {
if (imageByteData != null) {
Intent intent = new Intent(CameraViewActivity.this,SharePhotoActivity.class);
if(saveByteImage(context, imageByteData, 50)){
camera.startPreview();
startActivity(intent);
finish();
}
}
}
};
@Override
public void onResume() {
Log.e(TAG, "onResume");
super.onResume();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onStop() {
Log.e(TAG, "onStop");
super.onStop();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e(TAG, "surfaceCreated");
camera = Camera.open();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.e(TAG, "surfaceChanged");
if (isPreviewRunning) {
camera.stopPreview();
}
Camera.Parameters parameters = camera.getParameters();
int height = parameters.getPreviewSize().height;
int width = parameters.getPreviewSize().width;
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
switch (display.getRotation()) {
case Surface.ROTATION_0: {
parameters.setPreviewSize(width, height);
camera.setDisplayOrientation(90);
}
break;
case Surface.ROTATION_180: {
parameters.setPreviewSize(width, height);
}
break;
case Surface.ROTATION_270: {
parameters.setPreviewSize(width, height);
camera.setDisplayOrientation(180);
}
break;
case Surface.ROTATION_90: {
parameters.setPreviewSize(width, height);
}
break;
}
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
isPreviewRunning = true;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e(TAG, "surfaceDestroyed");
camera.stopPreview();
isPreviewRunning = false;
camera.release();
}
@Override
public void onClick(View arg0) {
camera.takePicture(null, mPictureCallback, mPictureCallback);
}
public static boolean saveByteImage(Context context, byte[] imageByteData, int quality) {
StringBuffer fileUri = new StringBuffer();
fileUri.append(SD_CARD_LOC);
fileUri.append(FILE_NAME);
fileUri.append("-");
fileUri.append(System.currentTimeMillis());
fileUri.append(JPEG_FORMAT);
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
Bitmap bitmapImage = BitmapFactory.decodeByteArray(imageByteData, 0, imageByteData.length, options);
FileOutputStream fos = new FileOutputStream(fileUri.toString());
BufferedOutputStream bos = new BufferedOutputStream(fos);
bitmapImage.compress(CompressFormat.JPEG, quality, bos);
bos.flush();
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
更新:メインのアクティビティとカメラ ビュー アクティビティの 2 つのアクティビティのみを含む新しい Android プロジェクトを作成しました。メイン アクティビティは、ボタン クリックでカメラ ビュー アクティビティを起動するだけです。そして、まだ画像を保存しません。