Capturar foto e gravar no cartão de memória

Bom dia meus caros companheiros de java de todos os dias…rsrsrsrsrs
Estou precisando da ajuda dos senhores para resolver um problema em relação a gravar arquivos no cartão de memória.
Eu vou precisar gravar imagens e videos no cartão de memória tirados pela câmera do aparelho.
Meu primeiro teste está sendo com fotos, segue a classe:

package com.daniel;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;

public class TakePicture extends Activity implements SurfaceHolder.Callback,
		OnClickListener 
{
	static final int FOTO_MODE = 0;
	private static final String TAG = "CameraTest";
	Camera mCamera;
	boolean mPreviewRunning = false;
	private Context mContext = this;

	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_surface);
		mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
		mSurfaceView.setOnClickListener(this);
		mSurfaceHolder = mSurfaceView.getHolder();
		mSurfaceHolder.addCallback(this);
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
	}

	Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
		public void onPictureTaken(byte[] imageData, Camera c) {

			if (imageData != null) {

				Intent mIntent = new Intent();

				StoreByteImage(mContext, imageData, 50,
						"ImageName");
				mCamera.startPreview();

				setResult(FOTO_MODE, mIntent);
				finish();

			}
		}
	};

	protected void onResume() {
		Log.e(TAG, "onResume");
		super.onResume();
	}

	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
	}

	protected void onStop() {
		Log.e(TAG, "onStop");
		super.onStop();
	}

	public void surfaceCreated(SurfaceHolder holder) {
		Log.e(TAG, "surfaceCreated");
		mCamera = Camera.open();

	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		Log.e(TAG, "surfaceChanged");

		// XXX stopPreview() will crash if preview is not running
		if (mPreviewRunning) {
			mCamera.stopPreview();
		}

		Camera.Parameters p = mCamera.getParameters();
		p.setPreviewSize(w, h);
		mCamera.setParameters(p);
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mCamera.startPreview();
		mPreviewRunning = true;
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		Log.e(TAG, "surfaceDestroyed");
		mCamera.stopPreview();
		mPreviewRunning = false;
		mCamera.release();
	}

	private SurfaceView mSurfaceView;
	private SurfaceHolder mSurfaceHolder;

	public void onClick(View arg0) {

		mCamera.takePicture(null, mPictureCallback, mPictureCallback);

	}
	
	public static boolean StoreByteImage(Context mContext, byte[] imageData,
			int quality, String expName) {

		Log.d("DEBUG","Store");
		String externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/download"; 
        File sdImageMainDirectory = new File(externalStoragePath+"/download");
		FileOutputStream fileOutputStream = null;
		String nameFile = "testeImage";
		try {

			BitmapFactory.Options options=new BitmapFactory.Options();
			options.inSampleSize = 5;
			
			Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
					imageData.length,options);

			
			fileOutputStream = new FileOutputStream(
					sdImageMainDirectory.toString() +"/"+nameFile+".jpg");
							
  
			BufferedOutputStream bos = new BufferedOutputStream(
					fileOutputStream);

			myImage.compress(CompressFormat.JPEG, quality, bos);

			bos.flush();
			bos.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return true;
	}

}

Bom, eu consigo ativar a câmera e tirar uma foto, tenho inclusive o preview dela, mas não consigo gravar no cartão, me dá um erro de javaFileNotFoundExceptin (permission denied).

Eu já coloquei no arquivo manifest a linha:

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

Mas mesmo assim o erro persiste.

Estou usando um milestone 2, android 2.2. Estou há duas horas procurando na web uma solução e não encontrei.

Desde já agradeço a atenção dos senhores.

Estou ressucitando o tópico pois estou com o mesmo problema, mas estou tentando gravar arquivo na memória interna do telefone. Não sei se faz diferença mas estou testando apenas no emulador, android 2.2

fileConfig = new File(Environment.getDataDirectory().getAbsolutePath() + "/arquivo.config");
fileOutputStream = openFileOutput(fileConfig.getAbsolutePath(), Context.MODE_PRIVATE);

dá erro de Permission Denied

Na lista de permissões do Manifest, não tem nada falando de arquivo. Se tiverem alguma idéia, preciso apenas gravar um arquivo na memória interna do telefone.

Voce precisa da permissão

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

[quote=Marky.Vasconcelos]Voce precisa da permissão

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

Essa permissão é para escrever no cartão de memória, preciso escrever na memória interna do aparelho.

Consegui fazer funcionar com o seguinte código:

fileOutputStream = openFileOutput("arquivo.config", Context.MODE_PRIVATE);

[quote=soaresinfo]Consegui fazer funcionar com o seguinte código:

fileOutputStream = openFileOutput("arquivo.config", Context.MODE_PRIVATE);

[/quote]

Apenas a título de curiosidade: pelo nome do arquivo que está gravando, é um arquivo de configurações? Porque se for, não deveria fazer assim!

Se for só para salvar configurações, SharedPreferences é a maneira mais facil e pratica.

Pessoal, eu tenho uma duvida…
Eu consigo capturar a imagem e ate mostra-la na tela, mas não sei como salvar no SD como eu quero, ou pegar o endereco na foto, para entao salvar tal endereco no banco da minha app…

Alguem consegue me dar a luz em poucas linhas? Procurei umonte na net… Estou seguindo o livro do ricardo lecheta, e esse tutorial: http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=10471&p=133751&hilit=camera#p133751

Meu codigo

já coloquei a permissao no Manifest

Na minha aplicação:

private void iniciaCamera() {
         ImageButton b = (ImageButton)findViewById(R.id.btAbrirCamera);
         b.setOnClickListener(new OnClickListener() {   
             
            public void onClick(View v) {
                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(i,CAPTURE_IMAGE);
                
            }
        });
        
    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
            super.onActivityResult(requestCode, resultCode, data);
            if(data!=null){
                Bundle bundle = data.getExtras();
                if(bundle!=null){
                    if (requestCode == CAPTURE_IMAGE) {
                        if (resultCode == Activity.RESULT_OK) {
                            
                            Bitmap bitmap =  (Bitmap) bundle.get("data");
                            ImageView img = (ImageView) findViewById(R.id.imagemAoVivo);
                            img.setImageBitmap(bitmap); // ateh aqui td bem..
                            
                            //essas 2 ultimas linhas deveriam fazer funcionar
                            Uri uriSavedImage = Uri.fromFile(new File(PersonalUtils.ENDERECO_SD+"/"+"Testando.jpg"));
                            data.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
                        }
                    }
                }
            }
      }

PersonalUtils.ENDERECO_SD -> Environment.getExternalStorageDirectory().toString()+"/"+NOMEPROJETO

Pessoal, estou há dias quebrando a cabeça com isso, gerando o .apk e testando no cel e nada…
Alguem ve alguma luz? A imagem eh salva no SD, mas só na pasta nativa, nao na pasta que criei…

ngm?