如何从SurfaceView android获取图像路径

如何从SurfaceView android获取图像路径,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,如何从SurfaceView获取图像路径直到现在我尝试了这段代码 public class CameraSwitch extends Activity implements SurfaceHolder.Callback, OnClickListener { private static final String TAG = "MainActivity"; private Cursor mImageCursor; private ImageThumbnailAdapte

如何从
SurfaceView
获取图像路径直到现在我尝试了这段代码

public class CameraSwitch extends Activity implements SurfaceHolder.Callback, OnClickListener {

    private static final String TAG = "MainActivity";

    private Cursor mImageCursor;
    private ImageThumbnailAdapter mAdapter;
    private TwoWayGridView mImageGrid;
    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    boolean previewing = false;
    LayoutInflater controlInflater = null;

    int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    int numberOfCamera;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.cameraswitch);

        surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        controlInflater = LayoutInflater.from(getBaseContext());
        View viewControl = controlInflater.inflate(R.layout.custom, null);


        Button switchCam = (Button)findViewById(R.id.flip);
    //    Button toggleFlash = (Button)findViewById(R.id.toggleflash);

        LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT);

        this.addContentView(viewControl, layoutParamsControl);


        switchCam.setOnClickListener(this);

    initGrid();


        Button picbtn = (Button) findViewById(R.id.button1);
        picbtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                camera.takePicture(null,null, new PhotoHandler(getApplicationContext()));
            }
        });
     }

    private void initGrid() {
        // TODO Auto-generated method stub
        Log.e("Bottom Grid View", "Grid view Bottom");

    }

    @SuppressLint("NewApi")
    public void openFrontFacingCamera() {
        numberOfCamera = Camera.getNumberOfCameras();
          if(camId == Camera.CameraInfo.CAMERA_FACING_BACK){
          camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
            Toast.makeText(getApplicationContext(), "BACK TO FRONT" ,1000).show();
                try {
                        Toast.makeText(getApplicationContext(), "try block BACK TO FRONT" ,1000).show();
                         camera.release();
                    camera = Camera.open(camId);
                    camera.setDisplayOrientation(90);
                    //camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);


                    /* Comment this set previewDisplay*/
                   // camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();
                    previewing = true;
                    } 
                catch (RuntimeException e)
                {
                    e.printStackTrace();
                } 
                catch (Exception e) {}
        }
        else if(camId == Camera.CameraInfo.CAMERA_FACING_FRONT){
            camId = Camera.CameraInfo.CAMERA_FACING_BACK;

            Toast.makeText(getApplicationContext(), "FRONT TO BACK" ,1000).show();
                    try {
                        camera.release();
                        camera = Camera.open(camId);
                        camera.setDisplayOrientation(90);
                        camera.setPreviewDisplay(surfaceHolder);
                        camera.startPreview();

                    } catch (RuntimeException e) {
                        e.printStackTrace();
            } catch (IOException e) {}
        }
    }

    @Override
    public void onClick(View click) {
        if(click.getId() == R.id.flip){
            openFrontFacingCamera();

        }else if(click.getId() == R.id.flip){
            openFrontFacingCamera();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if(previewing)
        {
            camera.stopPreview();
            previewing = false;
        }
        if (camera != null){

            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
                previewing = true;
            } catch (IOException e)
                {
                    e.printStackTrace();
                }
        }
    }

    @SuppressLint("NewApi")
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        camera = Camera.open(camId);

        camera.setDisplayOrientation(90);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }
}
图片处理程序类

 import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

public class PhotoHandler implements PictureCallback {

  private final Context context;

  public PhotoHandler(Context context) {
    this.context = context;
  }

  @Override
  public void onPictureTaken(byte[] data, Camera camera) {

    File pictureFileDir = getDir();

    if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

   //   Log.d(MakePhotoActivity.DEBUG_TAG, "Can't create directory to save image.");
      Toast.makeText(context, "Can't create directory to save image.",
          Toast.LENGTH_LONG).show();

      return;

    }

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
    String date = dateFormat.format(new Date());
    String photoFile = "Picture_" + date + ".jpg";

    String filename = pictureFileDir.getPath() + File.separator + photoFile;

    Log.e("path", filename.toString());

    File pictureFile = new File(filename);

    try {
      FileOutputStream fos = new FileOutputStream(pictureFile);
      fos.write(data);
      fos.close();
      Toast.makeText(context, "New Image saved:" + photoFile,Toast.LENGTH_LONG).show();
    } catch (Exception error) {
    //  Log.d(MakePhotoActivity.DEBUG_TAG, "File" + filename + "not saved: "
      //    + error.getMessage());
      Toast.makeText(context, "Image could not be saved.",
          Toast.LENGTH_LONG).show();
    }
  }

  private File getDir() {
    File sdDir = Environment
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    return new File(sdDir, "Demo App");
  }
} 
直到现在我都试过了 谢谢

在takePicture()方法中,一个参数是picture callback。您必须在拍摄的照片上实现该回调及其方法。它将以字节为单位提供图像数据。您可以从那里保存图像,然后您可以对该数据执行任何操作。此链接可能对您有所帮助

hi Bhavin Parmar我已经通过PhotoHandler类完成了这项工作,现在我想获取从该文件夹到CameraSwitch类的捕获图像路径。您可以将文件pictureFileDir设置为全局成员,或者在捕获时将图像路径存储在数据库中。您有一个方法getDir right。然后使用PhotoHandler实例记录getDir。