我已经阅读了很多类似的问题,但我找不到问题的解决方案。 乍一看,我正在做的一切正确,但目录创建不适用于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不能创建目录。
logcat的
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)