Android-Zapisywanie obrazów w określonym folderze

Muszę zapisać zdjęcia zrobione moją aplikacją w określonym folderze. Czytałem wiele rozwiązań tego problemu, ale żaden z nich nie zadziałał, więc proszę o pomoc.

Główna aktywność.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

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Author: Virag Brahme, 2013-08-02

3 answers

Przejść przez następujący kod, jego działa dobrze dla mnie.

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();
    }
}
 39
Author: mdDroid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 08:10:31

Użyj w ten sposób. To zadziała dla Ciebie.

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();
      }
    }
  }
Mam nadzieję, że to ci pomoże. w odniesieniu do użycia kamery intencji.
 6
Author: Nirmal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 09:03:04

Użyłem kodu mddroida tak:

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);
    }
}
 3
Author: The Dude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 04:35:36