*/ public List getVideos() {
List<Video> videos = new ArrayList<Video>();
Cursor c = null;
try {
// String[] mediaColumns = { "_id", "_data", "_display_name",
// "_size", "date_modified", "duration", "resolution" };
c = mContentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);
while (c.moveToNext()) {
String path = c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));// 路径
if (!FileUtils.isExists(path)) {
continue;
}
int id = c.getInt(c.getColumnIndexOrThrow(MediaStore.Video.Media._ID));// 视频的id
String name = c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)); // 视频名称
String resolution = c.getString(c.getColumnIndexOrThrow(MediaStore.Video.Media.RESOLUTION)); //分辨率
long size = c.getLong(c.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));// 大小
long duration = c.getLong(c.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));// 时长
long date = c.getLong(c.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED));//修改时间
Video video = new Video(id, path, name, resolution, size, date, duration);
videos.add(video);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
return videos;
}
其中,视频的bean类Video代码为:
public class Video { private int id = 0; private String path = null; private String name = null; private String resolution = null;// 分辨率 private long size = 0; private long date = 0; private long duration = 0;
public Video(int id, String path, String name, String resolution, long size, long date, long duration) {
this.id = id;
this.path = path;
this.name = name;
this.resolution = resolution;
this.size = size;
this.date = date;
this.duration = duration;
}
... //此处省略setter和getter方法
}
### 通过本地视频id获取视频缩略图
// 获取视频缩略图 public Bitmap getVideoThumbnail(int id) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; bitmap = MediaStore.Video.Thumbnails.getThumbnail(mContentResolver, id, MediaStore.Images.Thumbnails.MICRO_KIND, options); return bitmap; }
上面获取视频列表的方法中,Video对象中有一个属性是id,通过传入这个id可以获取到视频缩略图的Bitmap对象。
### 获取本机所有图片文件夹
/**
-
得到图片文件夹集合 */ public List getImageFolders() { List folders = new ArrayList(); // 扫描图片 Cursor c = null; try { c = mContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media.MIME_TYPE + "= ? or " + MediaStore.Images.Media.MIME_TYPE + “= ?”, new String[]{“image/jpeg”, “image/png”}, MediaStore.Images.Media.DATE_MODIFIED); List mDirs = new ArrayList();//用于保存已经添加过的文件夹目录 while (c.moveToNext()) { String path = c.getString(c.getColumnIndex(MediaStore.Images.Media.DATA));// 路径 File parentFile = new File(path).getParentFile(); if (parentFile == null) continue; String dir = parentFile.getAbsolutePath();
if (mDirs.contains(dir))//如果已经添加过
continue;
mDirs.add(dir);//添加到保存目录的集合中
ImgFolderBean folderBean = new ImgFolderBean();
folderBean.setDir(dir);
folderBean.setFistImgPath(path);
if (parentFile.list() == null)
continue;
int count = parentFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
if (filename.endsWith(".jpeg") || filename.endsWith(".jpg") || filename.endsWith(".png")) {
return true;
}
return false;
}
}).length;
folderBean.setCount(count);
folders.add(folderBean);
}
} catch (Exception e) { e.printStackTrace(); } finally { if (c != null) { c.close(); } } return folders; }
其中,图片文件夹的bean类ImgFolderBean代码为:
public class ImgFolderBean { /*当前文件夹的路径/ private String dir; /*第一张图片的路径,用于做文件夹的封面图片/ private String fistImgPath; /*文件夹名/ private String name; /*文件夹中图片的数量/ private int count;
public ImgFolderBean(String dir, String fistImgPath, String name, int count) {
this.dir = dir;
this.fistImgPath = fistImgPath;
this.name = name;
this.count = count;
}
... //此处省略setter和getter方法
}
### 获取图片文件夹下的图片路径的集合
/**
- 通过图片文件夹的路径获取该目录下的图片
*/ public List getImgListByDir(String dir) { ArrayList imgPaths = new ArrayList<>(); File directory = new File(dir); if (directory == null || !directory.exists()) { return imgPaths; } File[] files = directory.listFiles(); for (File file : files) { String path = file.getAbsolutePath(); if (FileUtils.isPicFile(path)) { imgPaths.add(path); } } return imgPaths; }
### 获取本机已安装应用列表
/**
-
获取已安装apk的列表 */ public List getAppInfos() { ArrayList appInfos = new ArrayList(); //获取到包的管理者 PackageManager packageManager = mContext.getPackageManager(); //获得所有的安装包 List installedPackages = packageManager.getInstalledPackages(0); //遍历每个安装包,获取对应的信息 for (PackageInfo packageInfo : installedPackages) { AppInfo appInfo = new AppInfo();
appInfo.setApplicationInfo(packageInfo.applicationInfo);
appInfo.setVersionCode(packageInfo.versionCode);
//得到icon
Drawable drawable = packageInfo.applicationInfo.loadIcon(packageManager);
appInfo.setIcon(drawable);
//得到程序的名字
String apkName = packageInfo.applicationInfo.loadLabel(packageManager).toString();
appInfo.setApkName(apkName);
//得到程序的包名
String packageName = packageInfo.packageName;
appInfo.setApkPackageName(packageName);
//得到程序的资源文件夹
String sourceDir = packageInfo.applicationInfo.sourceDir;
File file = new File(sourceDir);
//得到apk的大小
long size = file.length();
appInfo.setApkSize(size);
System.out.println("---------------------------");
System.out.println("程序的名字:" + apkName);
System.out.println("程序的包名:" + packageName);
System.out.println("程序的大小:" + size);
//获取到安装应用程序的标记
int flags = packageInfo.applicationInfo.flags;
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
//表示系统app
appInfo.setIsUserApp(false);
} else {
//表示用户app
appInfo.setIsUserApp(true);
}
if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
//表示在sd卡
appInfo.setIsRom(false);
} else {
//表示内存
appInfo.setIsRom(true);
}
appInfos.add(appInfo);
} return appInfos; }
其中,安装包信息的bean类AppInfo代码为:
public class AppInfo { private ApplicationInfo applicationInfo; private int versionCode = 0; /** * 图片的icon */ private Drawable icon;
/**
* 程序的名字
*/
private String apkName;
/**
* 程序大小
*/
private long apkSize;
/**
* 表示到底是用户app还是系统app
* 如果表示为true 就是用户app
* 如果是false表示系统app
*/
private boolean isUserApp;
/**
* 放置的位置
*/
private boolean isRom;
/**
* 包名
*/
private String apkPackageName;
... //此处省略setter和getter方法
}
### 获取文档、压缩包、apk安装包等
/**
-
通过文件类型得到相应文件的集合 **/ public List getFilesByType(int fileType) { List files = new ArrayList(); // 扫描files文件库 Cursor c = null; try { c = mContentResolver.query(MediaStore.Files.getContentUri(“external”), new String[]{"_id", “_data”, “_size”}, null, null, null); int dataindex = c.getColumnIndex(MediaStore.Files.FileColumns.DATA); int sizeindex = c.getColumnIndex(MediaStore.Files.FileColumns.SIZE); while (c.moveToNext()) {
String path = c.getString(dataindex);
if (FileUtils.getFileType(path) == fileType) {
if (!FileUtils.isExists(path)) {
continue;
}
long size = c.getLong(sizeindex);
FileBean fileBean = new FileBean(path, FileUtils.getFileIconByPath(path));
files.add(fileBean);
}
}
} catch (Exception e) { e.printStackTrace(); } finally { if (c != null) { c.close(); } } return files; }
传入的fileType文件类型是在FileUtils定义的文件类型声明:
/*文档类型/ public static final int TYPE_DOC = 0; /*apk类型/ public static final int TYPE_APK = 1; /*压缩包类型/ public static final int TYPE_ZIP = 2;
其中,FileUtils根据文件路径获取文件类型的方法getFileType(String path)为:
public static int getFileType(String path) { path = path.toLowerCase(); if (path.endsWith(".doc") || path.endsWith(".docx") || path.endsWith(".xls") || path.endsWith(".xlsx") || path.endsWith(".ppt") || path.endsWith(".pptx")) { return TYPE_DOC; }else if (path.endsWith(".apk")) { return TYPE_APK; }else if (path.endsWith(".zip") || path.endsWith(".rar") || path.endsWith(".tar") || path.endsWith(".gz")) { return TYPE_ZIP; }else{ return -1; } }
文件的bean类FileBean代码为:
public class FileBean { /** 文件的路径*/ public String path; /*文件图片资源的id,drawable或mipmap文件中已经存放doc、xml、xls等文件的图片/ public int iconId;
public FileBean(String path, int iconId) {
this.path = path;
this.iconId = iconId;
}
}
FileUtils根据文件类型获取图片资源id的方法,getFileIconByPath(path)代码为:
/*通过文件名获取文件图标/ public static int getFileIconByPath(String path){ path = path.toLowerCase(); int iconId = R.mipmap.unknow_file_icon; if (path.endsWith(".txt")){ iconId = R.mipmap.type_txt; }else if(path.endsWith(".doc") || path.endsWith(".docx")){ iconId = R.mipmap.type_doc; }else if(path.endsWith(".xls") || path.endsWith(".xlsx")){ iconId = R.mipmap.type_xls; }else if(path.endsWith(".ppt") || path.endsWith(".pptx")){ iconId = R.mipmap.type_ppt; }else if(path.endsWith(".xml")){ iconId = R.mipmap.type_xml; }else if(path.endsWith(".htm") || path.endsWith(".html")){ iconId = R.mipmap.type_html; } return iconId; }
上述各种文件类型的图片放置在mipmap中,用于展示文件列表时展示。
FileManager以及其他类的源码,可以点击下面的网址跳转查看和下载:
[点击查看源码(phone目录下的文件)](
)
### 最后
如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!
**转发+点赞+关注**,第一时间获取最新知识点
Android架构师之路很漫长,一起共勉吧!
#### 以下墙裂推荐阅读!!!
* [Android学习笔记参考(敲黑板!!)](
)
* [“寒冬未过”,阿里P9架构分享Android必备技术点,让你offer拿到手软!](
)
##### **如何做好面试突击,规划学习方向?**
面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。
学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。
我们搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
![img](https://img-blog.csdnimg.cn/img_convert/1775c64126605884e1dfce13790a288c.png)
我们在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多;
规划学习方向?**
面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。
学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。
我们搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
[外链图片转存中...(img-JU3fU4DJ-1630656612039)]
我们在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多;
##### **[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)**
|