0

私はシンプルなカメラ アプリ (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 プロジェクトを作成しました。メイン アクティビティは、ボタン クリックでカメラ ビュー アクティビティを起動するだけです。そして、まだ画像を保存しません。

4

1 に答える 1

0

私はそれを修正しました。

どうやら私が作成したプロトタイプは、バージョン 4 よりも古い android api バージョンを使用していたようです。

また、次の許可は必要ありません。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

追加したばかりで、今はうまく機能しています。

ありがとう。

于 2011-05-05T05:02:16.950 に答える