繁体   English   中英

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

[英]How to get current path from another class (Camera)

我正在开发一个应用程序,该应用程序从我的自定义相机类中拍摄图片,而不是像预览图像一样将其路径并放入Activity中的imageView中,现在我创建了一个类,用于处理Camera功能并将预览结果的路径发送给活动。 但是我的结果不是我拍摄的正确照片。 示例:第一次拍照时,我的“ 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;
        }       
    }

第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(); 

将已经执行。

您可以同步计算路径,但是即使如此,您的“活动”也必须等待将实际映像写入磁盘。 因此,您别无选择,只能提取片段

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() (无需从postDelayed()进行onPictureTaken() )异步执行它。


因此,快速和肮脏的修复(为简便起见,删除了异常处理)如下:

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); 
}

TakeApicture.java中

public void jpegCallBack() {
  jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
      getPicPath(data);
      (MainActivity)context.setImage(currentPicPath);
    }
  };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM