我已经阅读了许多类似的问题,但我找不到问题的解决方案。乍一看,我做的一切都是正确的,但是目录创建不适用于 API 17 和低版本。
显现
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
...
鳕鱼
// скачиваем файл
public void downloadWallpaper(String url, String name) {
final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
SharedPreferences preferenceManager = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
String Download_ID = "PREF_DOWNLOAD_ID";
// проверяем наличие подключения
if (activeNetwork != null && activeNetwork.isConnected()) {
for (int z = 0; z < 1; z++) {
// проверяем был ли уже загружен файл
File file = new File(Environment.getExternalStorageDirectory() + "/LiveWallpapers/" + name);
if (!file.exists()) {
// загружаем файл, т.к. его нет
Uri downloadUri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
// назначаем имя для файла
request.setDestinationInExternalPublicDir("LiveWallpapers", name);
// сохраняем request id
SharedPreferences.Editor PrefEdit = preferenceManager.edit();
long id = downloadManager.enqueue(request);
PrefEdit.putLong(Download_ID, id);
PrefEdit.apply();
} else {
// такой файл уже есть
break;
}
for (int p = 0; p < 30; p++) {
// проверяем был ли уже загружен файл
if (!file.exists()) {
// ожидаем загрузки файла
try {Thread.sleep(1000);} catch (InterruptedException e) {}
} else {
// файл загрузился
try {Thread.sleep(1000);} catch (InterruptedException e) {}
break;
}
}
}
}
}
对于 API 18 及更高版本的工作(/storage/sdcard/LiveWallpapers/...)
对于 API 17 和低版本,它不起作用(/mnt/sdcard/LiveWallpapers/...)
我也尝试手动创建一个目录
File folder = new File(Environment.getExternalStorageDirectory() + "/LiveWallpapers");
if (!folder.exists()) {
folder.mkdirs();
}
if (folder.exists()) {
...
}
该应用程序从 Internet 下载文件并创建目录 LiveWallpapers。对于 API 14、15、16、17 无法创建目录。
日志猫
03-15 15:41:15.411 2059-2059/com.developer.skyline.livewallpapers E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Unable to create directory: /mnt/sdcard/LiveWallpapers
at android.app.DownloadManager$Request.setDestinationInExternalPublicDir(DownloadManager.java:496)
at com.developer.skyline.livewallpapers.LiveWallpaperService$GifEngine.downloadWallpaper(LiveWallpaperService.java:379)
at com.developer.skyline.livewallpapers.LiveWallpaperService$GifEngine.<init>(LiveWallpaperService.java:206)
at com.developer.skyline.livewallpapers.LiveWallpaperService.onCreateEngine(LiveWallpaperService.java:41)
at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1012)
at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)