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

8 respostas
A

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.

8 Respostas

S

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.

M

Voce precisa da permissão

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

Marky.Vasconcelos:
Voce precisa da permissão

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

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

S

Consegui fazer funcionar com o seguinte código:

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

soaresinfo:
Consegui fazer funcionar com o seguinte código:

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

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!

M

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

L

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…

L

ngm?

Criado 15 de abril de 2011
Ultima resposta 8 de mai. de 2012
Respostas 8
Participantes 5