Я знаю, що на це відповіли і раніше, але я знаю, що багато людей натрапляють на це, тому я збираюся додати коментар.
У мене така сама проблема трапилася на моєму Nexus One. Це було з файлу, який не існує на диску до запуску програми для камери. Тому я переконався, що файл, який існував до запуску програми для камери. Ось приклад коду, який я використав:
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + MainActivity.this.getPackageName() + "/files/" + md5(upc) + ".jpg";
_photoFile = new File(path);
try {
if(_photoFile.exists() == false) {
_photoFile.getParentFile().mkdirs();
_photoFile.createNewFile();
}
} catch (IOException e) {
Log.e(TAG, "Could not create file.", e);
}
Log.i(TAG, path);
_fileUri = Uri.fromFile(_photoFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, _fileUri);
startActivityForResult(intent, TAKE_PICTURE);
} else {
new AlertDialog.Builder(MainActivity.this)
.setMessage("External Storeage (SD Card) is required.\n\nCurrent state: " + storageState)
.setCancelable(true).create().show();
}
Спочатку я створюю унікальне (дещо) ім'я файлу за допомогою хеша MD5 і вкладаю його у відповідну папку. Потім я перевіряю, чи існує він (не повинен, але все-таки його слід перевірити). Якщо його не існує, я отримую батьківський dir (папку) і створюю до нього ієрархію папок (тому, якщо папок, що ведуть до місця розташування файлу, не існує, вони з'являться після цього рядка. Потім після цього Я створюю файл. Після створення файлу я отримую Uri і передаю його до наміру, а потім кнопка «ОК» працює як очікувалося, і все золоте.
Тепер, коли на додатку камери натиснуто кнопку Гаразд, файл буде присутній у вказаному місці. У цьому прикладі це /sdcard/Android/data/com.example.myapp/files/234asdioue23498ad.jpg
Немає необхідності копіювати файл у "onActivityResult", як розміщено вище.