Android不会创建目录SD卡

时间:2017-03-15 15:11:04

标签: java android android-studio mkdir mkdirs

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

0 个答案:

没有答案