如何从另一个类(Camera)获取当前路径



我正在开发应用程序,从我的自定义相机类拍照,然后采取路径,并把imageView上的活动像预览图像,现在我创建了一个类来处理相机功能,并发送到活动的路径预览结果。但我的结果并不是我拍摄的正确的照片。示例:在我第一次拍照时,我的"currentPicpath"为null,但在我第二次拍照时,它给了我之前捕获的第一张图像。

因此,在类2中,我创建了一个方法,获取当前路径,但不会给出null,除非新拍摄的照片。

还有一个问题。为什么保存后的图像是相反的?我的课程:

MainActivity:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_additem);
        d_image_pre1 = (ImageView) findViewById(R.id.d_image1);

        d_BTakePicture = (Button) findViewById(R.id.d_bTakePicture);
        bOpenCamera = (Button) findViewById(R.id.bOpenCamera);
        d_BTakePicture.setOnClickListener(this);
        bOpenCamera.setOnClickListener(this);
        take = new TakeApicture(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bOpenCamera:
        take.openCam();
            break;
        case R.id.d_bTakePicture:
            take.makeFolder("myTest");
            take.captureImage();
            String path = take.getCurrentPicPath(); 
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
            Bitmap bm = BitmapFactory.decodeFile(path, options);
            d_image_pre1.setImageBitmap(bm); 
            break;
        default:
            break;
        }       
    }

class 2:

public class TakeApicture implements SurfaceHolder.Callback{
    Activity context;
    Camera camera;
    SurfaceView surface;
    SurfaceHolder holder;
    PictureCallback jpegCallback;
    File myGeneralFolder;
    FileOutputStream outStream = null;
    private String fullPathFolder;
    String currentPicPath = "No image path";

    @SuppressWarnings("deprecation")
    public TakeApicture(Activity context) {
        super();
        this.context = context;
        surface  = (SurfaceView)context.findViewById(R.id.surfaceView);
        holder = surface.getHolder();
        holder.addCallback(this);
         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
           jpegCallBack();

    }

       public void captureImage() {
            camera.takePicture(null, null, jpegCallback);
        }

    public void makeFolder(String itemFolderName) {
        fullPathFolder = Environment.getExternalStorageDirectory()+File.separator+"mySalesImages"+File.separator+itemFolderName;
        myGeneralFolder = new  File(fullPathFolder);
        myGeneralFolder.mkdirs();
    }

    public void jpegCallBack(){
        jpegCallback = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                    try {
                        getPicPath(data);
            } catch (IOException e) {
            e.printStackTrace();
            }
            }
        };
    }

    public void getPicPath(byte[] data) throws IOException{
        currentPicPath = String.format(myGeneralFolder+"/%d.jpg",(System.currentTimeMillis()));
        outStream = new FileOutputStream(currentPicPath);
        outStream.write(data); 
        outStream.close();
    }
    public String getCurrentPicPath() {
        return currentPicPath;
    }

    @SuppressWarnings("deprecation")
    public void openCam(){
        try {
        camera = Camera.open();
        Camera.Parameters param;
        param = camera.getParameters();
        //modify parameter
        camera.setDisplayOrientation(90);
        param.setPreviewFrameRate(20);
        param.setPreviewSize(176, 144);
        camera.setParameters(param);
        camera.setPreviewDisplay(holder);
        camera.startPreview();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public void closeCam(){
        camera.stopPreview();
        camera.release();
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        closeCam();
    }

}

这是正确的解决方案吗??

    take.captureImage();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
    String path = take.getCurrentPicPath(); 

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2;
    Bitmap bm = BitmapFactory.decodeFile(path, options);
    d_image_pre1.setImageBitmap(bm); 
        }
    }, 1000);

take.captureImage();启动了一个异步捕获照片的进程。过了一段时间,Android系统会调用你的onPictureTaken()回调,你会计算一个新的图像路径(并相应地写入照片)。但是

这一行
String path = take.getCurrentPicPath(); 

将已经被执行。

你可以同步计算路径,但即使这样你的Activity也必须等待实际的映像被写入磁盘。因此,您别无选择,只能提取该块

String path = take.getCurrentPicPath(); 
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bm = BitmapFactory.decodeFile(path, options);
d_image_pre1.setImageBitmap(bm); 

放到一个单独的方法中。你可以直接从onPictureTaken()调用这个新方法,或者你可以使用post()(不需要从onPictureTaken()调用postDelayed())来异步执行它。


因此,快速修复(为简洁起见删除了异常处理)的方法如下: 在<<p> strong> MainActivity.java :
public void onClick(View v) {
  switch (v.getId()) {
    case R.id.bOpenCamera:
      take.openCam();
      break;
    case R.id.d_bTakePicture:
      take.makeFolder("myTest");
      take.captureImage();
      break;
  }       
}
public void setImage(String path) {
  BitmapFactory.Options options = new BitmapFactory.Options();
  options.inSampleSize = 2;
  Bitmap bm = BitmapFactory.decodeFile(path, options);
  d_image_pre1.setImageBitmap(bm); 
}
在<<p> strong> TakeApicture.java :
public void jpegCallBack() {
  jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
      getPicPath(data);
      (MainActivity)context.setImage(currentPicPath);
    }
  };
}

最新更新