Android Невозможно создать каталог во внутренней памяти

У меня есть приложение, которое загружает все изображения с URL-адреса и сохраняет их в скрытой папке на устройстве. Это работает, если в телефоне есть внешняя SD-карта, но в противном случае приложение вылетает. Итак, я пытаюсь преобразовать свой код для хранения изображений во внутренней памяти.

Несмотря на то, что я прочитал много существующих вопросов, я не смог решить свою проблему. Я не знаю, может ли это быть ".setDestinationInExternalPublicDir" в моем "request.setAllowedNetworkTypes" причиной проблемы, может быть? Как мне изменить свой код?

Я также пытался использовать getDataDirectory или getFilesDir(), но у меня все еще есть исключение:

java.lang.IllegalStateException: невозможно создать каталог

Это мой текущий код, который работает с телефонами с внешней SD-картой:

public class ImagesDownloader {

private static File imageDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + ".Photo");
//or private static File imageDirectory; 

public static void downloadImages(Context context, List<MyList> imageList) {

        //here I tried to change the code like that (without success):
        //File imageDirectory = new File(Environment.getDataDirectory() + File.separator + ".Photo");
        //or
        //File imageDirectory = new File(context.getFilesDir() + File.separator + ".Photo");

        if (!imageDirectory.exists()) {
            if (!imageDirectory.mkdirs()) {
                Log.d("App", "failed to create directory");
            }
        }

        if(getImageFolderSize()==0){
            Iterator<MyList> iterator = imageList.iterator();
            while (iterator.hasNext()) {
                MyList MyList = iterator.next();
                String fileName = MyList.getFilename();
                String imgurl = "https://.../media/MyList/" + fileName;

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);

                File imageFile = new File(Environment.getExternalStoragePublicDirectory(
                        imageDirectory.getPath()) + "/" + fileName);

                //and here how I wanted to change the code (without success):
                //File imageFile = = new File(imageDirectory.getPath() + "/" + fileName);

                if (!imageFile.canRead()) {

                    DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(imgurl));

                    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
                            .setAllowedOverRoaming(false)
                            .setTitle(fileName)
                            .setDescription("file description")
                            .setDestinationInExternalPublicDir(imageDirectory.getPath(), fileName)
                            .setVisibleInDownloadsUi(true);

                    BroadcastReceiver onComplete = new BroadcastReceiver() {
                        public void onReceive(Context ctxt, Intent intent) {
                        }
                    };

                    context.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

                    if (downloadManager != null) {
                        downloadManager.enqueue(request);
                    }
                }
            }
        }
    }

    public static BitmapDescriptor getImgefromDeviceFolder(String fileName){

        File imageFile = new File(Environment.getExternalStoragePublicDirectory(
                imageDirectory.getPath()) + "/" + fileName);

        if (imageFile.canRead()) {
            Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
            return BitmapDescriptorFactory.fromBitmap(myBitmap);

        }
        return null;
    }

    static int getImageFolderSize(){

        File directory = Environment.getExternalStoragePublicDirectory(imageDirectory.getPath());
        if(directory.exists()){
            File[] files = directory.listFiles();
            if(files!=null){
                return files.length;
            }
        }
        return 0;
    }
}

Надеюсь, вы простите меня, если я допущу большие ошибки, я впервые работаю с архивированием файлов.


person TheOldBlackbeard    schedule 02.10.2019    source источник
comment
моя проблема немного другая, потому что я пытаюсь сохранить изображение во внутренней памяти...   -  person TheOldBlackbeard    schedule 02.10.2019
comment
Я уже установил разрешение, упомянутое в этом обсуждении, которое вы мне прислали, и все работает, если в телефоне есть внешняя SD-карта. Может быть, мне следует изменить название моего вопроса   -  person TheOldBlackbeard    schedule 02.10.2019


Ответы (1)


Этот код для одного изображения, и он работает.

вы можете протестировать его и изменить для своего списка изображений.

  public static void downloadImages(Context context, String fileName ) {
    String storagePath = Environment.getExternalStorageDirectory()
        .getPath()
        + "/Directory_name/";
    //Log.d("Strorgae in view",""+storagePath);
    File f = new File(storagePath);
    if (!f.exists()) {
      f.mkdirs();
    }
    //storagePath.mkdirs();
    String pathname = f.toString();
    if (!f.exists()) {
      f.mkdirs();
    }
    //                Log.d("Storage ",""+pathname);
    DownloadManager dm = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
    String imgurl = "https://.../media/MyList/" + fileName;
    Uri uri = Uri.parse(imgurl);
      DownloadManager.Request request = new DownloadManager.Request(uri);
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

      request.setDestinationInExternalPublicDir("", uri.getLastPathSegment());
      Long referese = dm.enqueue(request);

      Toast.makeText(context, "Downloading...", Toast.LENGTH_SHORT).show();

  }
person majid ghafouri    schedule 02.10.2019
comment
К сожалению, теперь у меня есть java.lang.IllegalStateException: невозможно создать каталог: /storage/emulated/0/storage/emulated/0/.Photo - person TheOldBlackbeard; 02.10.2019