• android pdf框架-4,分析vudroid源码2


    继续分析源码

    阅读器的入口
    MainBrowserActivity,这个是主ui,由于代码较旧,所以没有处理sdcard的权限.

    一般阅读器申请整个卡的读写.

    1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    2. if (!Environment.isExternalStorageManager()) {
    3. Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
    4. .setData(Uri.parse("package:" + getPackageName()));
    5. startActivity(intent);
    6. }
    7. } else {
    8. if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    9. != PackageManager.PERMISSION_GRANTED) {
    10. if (ActivityCompat.shouldShowRequestPermissionRationale(this,
    11. Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    12. } else {
    13. ActivityCompat.requestPermissions(this,
    14. new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
    15. 1);
    16. }
    17. }
    18. }
    
    
    
    
    

    这样就可以管理卡了.

    如果有外部传来uri,就先处理uri,这里的什么做法是由主页去接收uri,再分发到具体的页面.

    而不把具体渲染页作为接收页,所以会处理onnewintent方法.

    如果没有外部uri,则sdcard权限申请过了,就加载文件列表.且带过滤的.

    父类BaseBrowserActivity,有两个tab,我把listview修改为recyclerview

    为了更好的性能,与时俱进的.

    UriBrowserAdapter是历史记录.在ui显示方面修改了样式
    BrowserAdapter是文件浏览.

    加载逻辑是在BrowserAdapter中的,

    1. public void setCurrentDirectory(File currentDirectory) {
    2. final File[] fileArray = currentDirectory.listFiles(filter);
    3. ArrayList<File> files = new ArrayList<>(fileArray != null ? Arrays.asList(fileArray) : Collections.<File>emptyList());
    4. this.currentDirectory = currentDirectory;
    5. Collections.sort(files, (o1, o2) -> {
    6. if (o1 == null && o2 == null) {
    7. return 0;
    8. }
    9. if (o1.isDirectory() && o2.isFile()) return -1;
    10. if (o1.isFile() && o2.isDirectory()) return 1;
    11. if (o1.lastModified() - o2.lastModified() > 0) {
    12. return -1;
    13. } else if (o1.lastModified() - o2.lastModified() < 0) { //jdk7以上需要对称,自反,传递性.
    14. return 1;
    15. } else {
    16. return 0;
    17. }
    18. });
    19. if (currentDirectory.getParentFile() != null) {
    20. files.add(0, currentDirectory.getParentFile());
    21. }
    22. setFiles(files);
    23. }
    24. public void setFiles(List<File> files) {
    25. submitList(files);
    26. }

    这里我对排序作了修改,目录在前,修改日期倒序.

    其它的内容看源码即可,文末有下载地址,或者看vudroid源码,可以去github搜索.因为它原来是在google code上的,已经没了.

    显示的activity父类BaseViewerActivity
    1. @Override
    2. public void onCreate(Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. //处理了全屏操作
    5. StatusBarHelper.hideSystemUI(this);
    6. StatusBarHelper.setImmerseBarAppearance(getWindow(), true);
    7. //初始化解码线程池
    8. initDecodeService();
    9. final ZoomModel zoomModel = new ZoomModel();
    10. final DecodingProgressModel progressModel =
  • 相关阅读:
    23、STM32——CAN
    SQL 注入绕过(六)
    hdu7244-Winner Prediction(22多校第十场1001 dinic最大流)
    【LeetCode热题100】--148.排序链表
    JAVASUNHome家政服务管理平台计算机毕业设计Mybatis+系统+数据库+调试部署
    物联网技术应用属于什么专业分类
    go 中如何实现定时任务
    【无标题】
    Util应用框架基础(一) - 依赖注入
    DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)
  • 原文地址:https://blog.csdn.net/archko/article/details/136263889