File.createTempFile выдает отказ в разрешении

#java #android #android-studio

#ява #Android #android-studio #java

Вопрос:

я хочу создать файл для сохранения изображения в формате jpg

  public static File createImageFile() throws IOException {
    final String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    final String imageFileName = "IMG_"   timestamp;
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME);
    storageDir.mkdirs();
    return File.createTempFile(imageFileName, ".jpg", storageDir);
}
  

выше приведена моя функция для создания файла, расположенная в классе с именем FileHelper, и это пример кода, когда я использую эту функцию

  if (filePath == null) {
     File photoFile = null;
     try {
        photoFile = FileHelper.createImageFile();
     } catch (IOException e) {
        e.printStackTrace();
     }
     filePath = photoFile.getAbsolutePath();

     BitmapFactory.Options options = new BitmapFactory.Options();
     options.inSampleSize = 2;
     try {
        bmp = getBitmap(filePath);
     } catch (Exception e) {
        e.printStackTrace();
        bmp = BitmapHelper.reduceResolution(filePath, widthPixels, heightPixels);
     }
  } 
  

это работает на некоторых устройствах, и это также выдает ошибку на некоторых устройствах, и ошибка:

 W/System.err: java.io.IOException: Permission denied
W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W/System.err:     at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
    at java.io.File.createTempFile(File.java:2018)
    at com.mogawe.mosurvei.util.FileHelper.createImageFile(FileHelper.java:671)
  

кто-нибудь знает, как это исправить?

Комментарии:

1. вы получили разрешение на хранение ?

2. Какова ваша targetSdkVersion и в API какого устройства вы запускаете это приложение? (Потому что в Oreo я могу получить путь к файлу, используя sme-код)

3. @NaitikSoni мой targetSdkVersion равен 29, а minSdkVersion равен 23

4. @Jyotishbis Было так, что я сделал это

Ответ №1:

Я нашел решение для своей собственной проблемы >_<, поэтому решение было здесь. Если вы нацелены на Android 10 (уровень API 29) или выше, установите значение requestLegacyExternalStorage на true в файле манифеста вашего приложения:

 <manifest ... >
<!-- This attribute is "false" by default on apps targeting
     Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>
  

надеюсь, это поможет тем, у кого такая же проблема, спасибо!