Я разрабатываю приложение, мне нужна функция, которая позволяет открывать камеру, чтобы сделать фотографию и сохранять ее в пути Изображения / Пример Я сохраняю изображение в этом пути, чтобы оно можно открыть из приложения Google Photos.
С помощью этого фрагмента я создаю путь и имя изображения и открываю камеру:
private void openCameraTocaptureImage() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.cameraimage.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
Мои сомнения присутствуют при вызове createImageFile()
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES+"/Example");//********* Here is my doubt ******
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
Пока приложение соответствует тому, что мне нужно, делает снимок и сохраняет его в Pictures / Example и может быть просмотрено из приложения Photos, но с чтением документации Я нашел это:
getExternalStorageDirectory
Этот метод устарел на уровне API 29. Для улучшения конфиденциальности пользователей прямой доступ к общему / внешнему хранилищу устройства устарели. Когда приложение предназначается для Build.VERSION_CODES.Q, путь, возвращаемый этим методом, больше не доступен напрямую для приложений. Приложения могут продолжать получать доступ к содержимому, хранящемуся в общем / внешнем хранилище, путем перехода на другие альтернативы, такие как Context # getExternalFilesDir (String), MediaStore или Intent # ACTION_OPEN_DOCUMENT.
Я решил использовать getExternalFilesDir
, поэтому Я попытался заменить
File storageDir = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES+"/Example");
на
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES+"/Example");
Таким образом, код выглядит так:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES+"/Example");
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
Но это заставляет мою фотографию храниться в Android / data / com.example.cameraimage / files / Pictures / Example это не тот путь, который я хочу, и он не отображается в приложении Photos
Основной вопрос, должен ли я прекратить использование getExternalStorageDirectory()
, даже если оно работает? Если мне нужно изменить, как я могу использовать любую из альтернатив, чтобы я мог хранить фотографии в Pictures / Example и отображать изображения в приложении Photos?