Android: guarde las imágenes en una carpeta específica

Necesito guardar las imágenes tomadas con mi aplicación en una carpeta específica. He leído muchas soluciones a este problema, pero no pude hacer que ninguna funcione, así que pido ayuda.

MainActivity.java

public void onClick(View v) { Intent camera = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); //Folder is already created String dirName = Environment.getExternalStorageDirectory().getPath() + "/MyAppFolder/MyApp" + n + ".png"; Uri uriSavedImage = Uri.fromFile(new File(dirName)); camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); startActivityForResult(camera, 1); n++; } 

AndroidManifest.xml

   

Revise el siguiente código, está funcionando bien para mí.

 private void createDirectoryAndSaveFile(Bitmap imageToSave, String fileName) { File direct = new File(Environment.getExternalStorageDirectory() + "/DirName"); if (!direct.exists()) { File wallpaperDirectory = new File("/sdcard/DirName/"); wallpaperDirectory.mkdirs(); } File file = new File(new File("/sdcard/DirName/"), fileName); if (file.exists()) { file.delete(); } try { FileOutputStream out = new FileOutputStream(file); imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 

Use Like this. Funcionará para ti.

 public void onClick(View v) { Intent camera = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, 1); } protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case 1: if(resultCode == RESULT_OK) { Uri selectedImage = imageReturnedIntent.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); //file path of captured image filePath = cursor.getString(columnIndex); //file path of captured image File f = new File(filePath); filename= f.getName(); Toast.makeText(getApplicationContext(), "Your Path:"+filePath, 2000).show(); Toast.makeText(getApplicationContext(), "Your Filename:"+filename, 2000).show(); cursor.close(); //Convert file path into bitmap image using below line. // yourSelectedImage = BitmapFactory.decodeFile(filePath); Toast.makeText(getApplicationContext(), "Your image"+yourSelectedImage, 2000).show(); //put bitmapimage in your imageview //yourimgView.setImageBitmap(yourSelectedImage); Savefile(filename,filePath); } } } public void Savefile(String name, String path) { File direct = new File(Environment.getExternalStorageDirectory() + "/MyAppFolder/MyApp/"); File file = new File(Environment.getExternalStorageDirectory() + "/MyAppFolder/MyApp/"+n+".png"); if(!direct.exists()) { direct.mkdir(); } if (!file.exists()) { try { file.createNewFile(); FileChannel src = new FileInputStream(path).getChannel(); FileChannel dst = new FileOutputStream(file).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } catch (IOException e) { e.printStackTrace(); } } } 

Espero que esto te ayudará. como referencia para usar la intención de la cámara .

He usado el código de mdDroid así:

 public void startCamera() { // Create photo newPhoto = new Photo(); newPhoto.setName(App.getPhotoName()); //Create folder !exist String folderPath = Environment.getExternalStorageDirectory() + "/PestControl"; File folder = new File(folderPath); if (!folder.exists()) { File wallpaperDirectory = new File(folderPath); wallpaperDirectory.mkdirs(); } //create a new file newFile = new File(folderPath, newPhoto.getName()); if (newFile != null) { // save image here Uri relativePath = Uri.fromFile(newFile); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, relativePath); startActivityForResult(intent, CAMERA_REQUEST); } }