写一个Android遍历SD卡目录找出所有图片文件并将其按照其来源的软件进行分类,且存储在Map<String, List<File>>里,key值为“应用名称+图片”,value值为当前file的代码
时间: 2023-06-26 21:04:08 浏览: 51
以下是一个简单的实现示例:
```
public Map<String, List<File>> findPicturesByApp(Context context) {
Map<String, List<File>> picturesByApp = new HashMap<>();
// 从外部存储器获取SD卡目录
File sdCardDirectory = Environment.getExternalStorageDirectory();
// 遍历SD卡目录
File[] files = sdCardDirectory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
// 如果是目录,则递归遍历子目录
findPicturesByAppInDirectory(context, file, picturesByApp);
} else if (isPictureFile(file)) {
// 如果是图片文件,则将其添加到Map中
String appName = getAppNameByPackageName(context, getPackageNameByFilePath(file.getAbsolutePath()));
String key = appName + "图片";
if (!picturesByApp.containsKey(key)) {
picturesByApp.put(key, new ArrayList<File>());
}
picturesByApp.get(key).add(file);
}
}
}
return picturesByApp;
}
private void findPicturesByAppInDirectory(Context context, File directory, Map<String, List<File>> picturesByApp) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
findPicturesByAppInDirectory(context, file, picturesByApp);
} else if (isPictureFile(file)) {
String appName = getAppNameByPackageName(context, getPackageNameByFilePath(file.getAbsolutePath()));
String key = appName + "图片";
if (!picturesByApp.containsKey(key)) {
picturesByApp.put(key, new ArrayList<File>());
}
picturesByApp.get(key).add(file);
}
}
}
}
private boolean isPictureFile(File file) {
String name = file.getName();
return name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png") || name.endsWith(".gif");
}
private String getPackageNameByFilePath(String filePath) {
PackageManager pm = context.getPackageManager();
List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
for (PackageInfo packageInfo : packages) {
String packagePath = packageInfo.applicationInfo.sourceDir;
if (filePath.startsWith(packagePath)) {
return packageInfo.packageName;
}
}
return null;
}
private String getAppNameByPackageName(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = null;
try {
appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (appInfo != null) {
return pm.getApplicationLabel(appInfo).toString();
}
return null;
}
```
注释详细,可根据需要进行修改。