ImageLoader: java.io.FileNotFoundException: /storage/sdcard0/Android/data/[...]/cache/uil-images/jo

本文分析了在Android应用中,由于SD卡插拔导致缓存路径发生变化而引发的应用崩溃问题。通过深入研究ImageLoader配置及SD卡路径变化机制,提供了一种通过检查MTK_2SDCARD_SWAP值来动态调整缓存路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插拔SD卡出现:

01-23 15:48:00.512  2385  2385 E ImageLoader: /storage/sdcard0/Android/data/com.android.customerservice/cache/uil-images/journal.tmp: open failed: EIO (I/O error)
01-23 15:48:00.512  2385  2385 E ImageLoader: java.io.FileNotFoundException: /storage/sdcard0/Android/data/com.android.customerservice/cache/uil-images/journal.tmp: open failed: EIO (I/O error)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at libcore.io.IoBridge.open(IoBridge.java:496)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.cache.disc.impl.ext.DiskLruCache.rebuildJournal(DiskLruCache.java:358)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.cache.disc.impl.ext.DiskLruCache.open(DiskLruCache.java:250)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache.initCache(LruDiskCache.java:112)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache.<init>(LruDiskCache.java:106)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.core.DefaultConfigurationFactory.createDiskCache(DefaultConfigurationFactory.java:89)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.core.ImageLoaderConfiguration$Builder.initEmptyFieldsWithDefaultValues(ImageLoaderConfiguration.java:580)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.nostra13.universalimageloader.core.ImageLoaderConfiguration$Builder.build(ImageLoaderConfiguration.java:559)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.android.customerservice.activity.UserFeedbackChildActivity.onCreate(UserFeedbackChildActivity.java:160)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.Activity.performCreate(Activity.java:6100)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2481)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2614)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.ActivityThread.access$800(ActivityThread.java:178)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.os.Handler.dispatchMessage(Handler.java:111)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.os.Looper.loop(Looper.java:194)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at android.app.ActivityThread.main(ActivityThread.java:5643)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at java.lang.reflect.Method.invoke(Native Method)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at java.lang.reflect.Method.invoke(Method.java:372)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-23 15:48:00.512  2385  2385 E ImageLoader: Caused by: android.system.ErrnoException: open failed: EIO (I/O error)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at libcore.io.Posix.open(Native Method)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
01-23 15:48:00.512  2385  2385 E ImageLoader:   at libcore.io.IoBridge.open(IoBridge.java:482)
01-23 15:48:00.512  2385  2385 E ImageLoader:   ... 23 more

软件包名为com.android.customerservice,在com.android.customerservice.activity.UserFeedbackChildActivity的onCreate()方法中进行ImageLoader配置:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
                .threadPriority(Thread.NORM_PRIORITY - 2)//设置当前线程的优先级
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())//使用MD5对UIL进行加密命名
                .diskCacheSize(100 * 1024 * 1024)// sd卡(本地)缓存的最大值
                .tasksProcessingOrder(QueueProcessingType.LIFO)//后进先出
                .build();

在UserFeedbackChildActivity页面时插拔SD卡,会闪退(必现),这是因为缓存路径会随着SD卡的插拔发生改变,在项目配置mk文件ProjectConfig.mk中有一个值MTK_2SDCARD_SWAP = yes/no,这个值可以通过反射得到:

 public static String getSwap() {
        Object result = null;
        try {
            Class cl = Class.forName("android.os.SystemProperties");
            Object invoker = cl.newInstance();
            Method m = cl.getMethod("get", new Class[] { String.class, String.class });
            result = m.invoke(invoker, new Object[] { "ro.mtk_2sdcard_swap", "unknown" });
            return (String) result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return (String) result;
    }

若MTK_2SDCARD_SWAP = yes,则插上SD卡,其路径为/storage/sdcard0,手机内置SD卡路径为/storage/sdcard1,若拔出SD卡,则手机内置SD卡路径会变为/storage/sdcard0。路径的改变会导致FileNotFoundException,进一步导致其他异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值