У меня есть приложение, которое загружает все изображения с 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;
}
}
Я надеюсь, что вы можете простить меня, если я сделаю какие-то большие ошибки, это первый раз, когда яработа с архивом файлов