Android Невозможно создать каталог на внутреннем хранилище - PullRequest
1 голос
/ 02 октября 2019

У меня есть приложение, которое загружает все изображения с 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;
    }
}

Я надеюсь, что вы можете простить меня, если я сделаю какие-то большие ошибки, это первый раз, когда яработа с архивом файлов

1 Ответ

0 голосов
/ 02 октября 2019

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

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

  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();

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...