您的位置:

glide有IllegalStateException("Failed to generate expected directory: " + expectedDirectory)报错是怎么回事

  发布时间:2023-01-15 17:20:01
你可以尝试以下方法来解决这个问题,在AndroidManifest.xml中添加写入权限在你的activity 或者 fragment中动态获取权限检查你的手机存储空间是否足够如果仍然有问题,使用Glide的缓存目录来配置缓存位置在你的Application中配置缓存大小和目录清除缓存这些都是一些可能导致错误的原因和解决方案。如果权限被授予,我们就可以继续执行需要写入权限的操作,如果权限被拒绝,我们就需要禁用依赖于该权限的功能。

报错的原因

glide的 IllegalStateException 异常是由于在手机上没有写入权限或者没有足够的存储空间导致的。在加载图片时,Glide会尝试在手机上创建一个临时目录来存储图片,如果没有写入权限或者没有足够的存储空间,就会抛出这个异常。

你可以尝试以下几种方法来解决这个问题

1.在AndroidManifest.xml中添加写入权限



2.在你的activity 或者 fragment中动态获取权限


if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
    }
} else {
    // Permission has already been granted
}

3.检查你的手机存储空间是否足够

4. 使用Glide的缓存目录来配置缓存位置。


Glide.get(context).setDiskCache(
        new ExternalPreferredCacheDiskCacheFactory(context, diskCacheFolderName, diskCacheSize));

5.在你的Application中配置缓存大小和目录


public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Glide.get(this).setMemoryCategory(MemoryCategory.HIGH);
        Glide.get(this).setDiskCache(new InternalCacheDiskCacheFactory(this, cacheSize100MegaBytes));
    }
}

6. 清除缓存


// Clear memory cache
Glide.get(context).clearMemory();
// Clear disk cache
Glide.get(context).clearDiskCache();

这些都是一些可能导致"Failed to generate expected directory"错误的原因和解决方案。最终的解决方案可能因您的应用程序和环境而异。如果问题仍然存在,请提供更多的细节和代码,我会尽力帮助您。

如何解决

首先,您需要确定出现错误的原因。如果是因为没有写入权限或者没有足够的存储空间,则可以尝试以下解决方案:

1.在AndroidManifest.xml中添加写入权限



2.在你的activity 或者 fragment中动态获取权限


if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
    }
} else {
    // Permission has already been granted
}

3.检查你的手机存储空间是否足够

如果是因为其他原因,你可以尝试以上其他解决方案,如使用缓存目录来配置缓存位置,在你的Application中配置缓存大小和目录,清除缓存。

如果问题仍然存在,请提供更多的细节和代码,我会尽力帮助您。

使用例子

当然有,以下是一个在应用程序中动态获取写入权限的示例:


public class MainActivity extends AppCompatActivity {
    private static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            // Permission is not granted
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
            } else {
                // No explanation needed; request the permission
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        } else {
            // Permission has already been granted
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }

}

在这个例子中,我们首先检查是否已经获得了写入权限。如果没有,我们就解释为什么需要这项权限,并请求用户授予权限。当用户授予权限后,我们可以在 onRequestPermissionsResult() 方法中检查结果。如果权限被授予,我们就可以继续执行需要写入权限的操作,如果权限被拒绝,我们就需要禁用依赖于该权限的功能。

这只是一个简单的示例,您可以根据需要自由扩展和修改。