2014-01-18 253 views
0

我已经尝试了很多相机示例为Android,但thishttp://androideity.com/2011/10/08/hello-camera/)是冷杉我得到保存图像并在画廊上查看它。但我想知道的是如何更改保存图像的文件夹。我想实际上它可以将它们保存在sdcard0/DCIM之上。更改目录文件 - 安卓相机

下面是主要活动:

public class Foto extends Activity implements SurfaceHolder.Callback{ 

private LayoutInflater myInflater = null; 
Camera myCamera; 
byte[] tempdata; 
boolean myPreviewRunning = false; 
private SurfaceHolder mySurfaceHolder; 
private SurfaceView mySurfaceView; 
ImageButton takePicture; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.foto); 

    mySurfaceView = (SurfaceView) findViewById(R.id.surface); 
    mySurfaceHolder = mySurfaceView.getHolder(); 
    mySurfaceHolder.addCallback(this); 
    mySurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    myInflater = LayoutInflater.from(this); 
    View overView = myInflater.inflate(R.layout.segundacapa,null); 
    this.addContentView(overView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 

    takePicture = (ImageButton) findViewById(R.id.button); 
    takePicture.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myCamera.takePicture(myShutterCallback, myPictureCallback, myJpeg); 
     } 
    }); 


} 

ShutterCallback myShutterCallback = new ShutterCallback() { 
    @Override 
    public void onShutter() { 
    } 
}; 

PictureCallback myPictureCallback = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera myCamera) { 
     // TODO Auto-generated method stub 
    } 
}; 

PictureCallback myJpeg = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera myCamera) { 
     // TODO Auto-generated method stub 
     if(data != null){ 
      tempdata = data; 
      done(); 
     } 
    } 
}; 

void done(){ 
    Bitmap bm = BitmapFactory.decodeByteArray(tempdata, 0, tempdata.length); 
    String url = Images.Media.insertImage(getContentResolver(), bm, null, null); 
    bm.recycle(); 
    Bundle bundle = new Bundle(); 
    if(url != null){ 
     bundle.putString("url",url); 
     Intent mIntent = new Intent(); 
     mIntent.putExtras(bundle); 
     setResult(RESULT_OK, mIntent); 
     Toast.makeText(this, "Picture saved on" + url, Toast.LENGTH_SHORT).show(); 
    } 
    else{ 
     Toast.makeText(this, "Picture can not be saved", Toast.LENGTH_SHORT).show(); 
    } 
    finish(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // TODO Auto-generated method stub 
    try{ 
     if(myPreviewRunning){ 
      myCamera.stopPreview(); 
      myPreviewRunning = false; 
     } 
     Camera.Parameters p = myCamera.getParameters(); 
     p.setPreviewSize(width,height); 

     myCamera.setParameters(p); 
     myCamera.setPreviewDisplay(holder); 
     myCamera.startPreview(); 
     myPreviewRunning = true; 
    }catch(Exception e){} 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
     myCamera = Camera.open(); 
    } 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    myCamera.stopPreview(); 
    myPreviewRunning = false; 
    myCamera.release(); 
    myCamera = null; 
    }  
} 

还有与SurfaceView(称为foto.xml),另一个称为segundacapa.xml与按钮的XML布局。

非常感谢!

回答

1

而不是使用Images.Media在磁盘上存储的图像(使用默认位置),您可以使用insertImage()另一种味道,这需要文件路径。你应该先写文件。您不需要将onPictureTaken()->data转换为Bitmap;您只需将byte[]写入Jpeg文件即可。

FileOutputStream fos = openFileOutput("saved.jpg", Context.MODE_PRIVATE); 
fos.write(data); 
fos.close(); 

您可以根据需要选择文件名;你可以保存与其他参数(见更多Context.openFileOutput()文件可以打开诡计上/SD卡,如果你愿意的话,如

FileOutputStream fos = new FileOutputStream("/sdcard/saved.jpg"); 

请注意,您需要申请许可写入SD卡。检查显示以下行AndroidManifest.xml中

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