以编程方式清除Nougat中的缓存,不允许

时间:2018-07-30 06:33:57

标签: java android android-7.0-nougat

我想在服务器上执行一些活动后清除应用程序的缓存。在三星手机(Android 5.0)中可以正常工作,但在华为手机(Android 7)中无法清除缓存。 我认为Nougat未授予该应用程序的许可。有关此问题的任何帮助将不胜感激。

缓存清除代码:

       public static void trimCache(Context context) {
         try {
        Toast.makeText(context,"hit on trim function 
        ",Toast.LENGTH_SHORT).show();
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            boolean check =deleteDir(dir);
            System.out.println("cache content check" +check);
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}

public static boolean deleteDir(File dir) {
   Log.e("Mainactivity","Inside delete");
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        Log.e("Mainactivity","Inside delete if condition"+children);
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // The directory is now empty so delete it
    return dir.delete();
}

在清单中添加了权限:

  <uses-permission android:name="android.permission.CLEAR_APP_CACHE"  
  tools:ignore="ProtectedPermissions"/>

2 个答案:

答案 0 :(得分:0)

我认为您的问题在@CommonsWare答案here中得到了很好的解释:

  

在Android 6.0之前,CLEAR_APP_CACHE的保护级别为   危险,因此普通的SDK应用程序可能会在清单中提出要求。

     

从Android 6.0开始,CLEAR_APP_CACHE的保护级别为   签名。普通的Android应用无法容纳此功能   允许。如果您的应用已签名,则只能持有此权限   使用固件的签名密钥,或者您以特权安装   系统分区。

答案 1 :(得分:0)

对于低于Android 6.0和高于Android 6.0 来说,这对我都有效:

  1. 声明清单权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  2. 从要清除缓存的位置声明此方法:

    private static void deleteCache(Context context) {
        try {
            File dir = context.getCacheDir();
            deleteDir(dir);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (String aChildren : children) {
                boolean success = deleteDir(new File(dir, aChildren));
                if (!success) {
                    return false;
                }
            }
            return dir.delete();
        } else if (dir != null && dir.isFile()) {
            return dir.delete();
        } else {
            return false;
        }
    }