【问题标题】:Search all .pdf file present in the Android device搜索 Android 设备中存在的所有 .pdf 文件
【发布时间】:2011-08-04 10:02:44
【问题描述】:

如何通过程序化方式搜索Android设备中存在的所有.pdf和.doc文件?

【问题讨论】:

    标签: android


    【解决方案1】:

    尝试使用下面的代码,这对你有用。

     public void walkdir(File dir) {
        String pdfPattern = ".pdf";
    
        File listFile[] = dir.listFiles();
    
        if (listFile != null) {
            for (int i = 0; i < listFile.length; i++) {
    
                if (listFile[i].isDirectory()) {
                    walkdir(listFile[i]);
                } else {
                  if (listFile[i].getName().endsWith(pdfPattern)){
                                      //Do what ever u want
    
                  }
                }
            }
        }    
    }
    

    编辑

    要搜索整个 sdcard 调用这个函数使用

    walkdir(Environment.getExternalStorageDirectory());
    

    【讨论】:

    • 它非常慢。你知道什么可以更快。
    • Environment.getExternalStorageDirectory() 对于 API29 及更高版本已弃用。有没有其他选择?
    • @BurakDizlek 您可以查看my answer 以获取内部和外部目录。
    • 不适用于 Android 11
    【解决方案2】:

    看看here

    基本上得到一个起始目录,然后用过滤器(FilenameFilter)调用“列表”,然后遍历子目录。不确定是否有一个功能可以为您完成所有这些工作。

    【讨论】:

      【解决方案3】:

      从这里下载源代码 (Open pdf file from sdcard in android programmatically)

      在您的 Gradle 文件中添加此依赖项:

      compile ‘com.github.barteksc:android-pdf-viewer:2.0.3’
      

      MainActivity.java:

      package com.pdffilefromsdcard;
      
      import android.Manifest;
      import android.app.ProgressDialog;
      import android.content.Intent;
      import android.content.pm.PackageManager;
      import android.os.Environment;
      import android.support.v4.app.ActivityCompat;
      import android.support.v4.content.ContextCompat;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.widget.AdapterView;
      import android.widget.ListView;
      import android.widget.Toast;
      
      import java.io.File;
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.List;
      
      public class MainActivity extends AppCompatActivity {
      
      ListView lv_pdf;
      public static ArrayList<File> fileList = new ArrayList<File>();
      PDFAdapter obj_adapter;
      public static int REQUEST_PERMISSIONS = 1;
      boolean boolean_permission;
      File dir;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      init();
      
      }
      
      private void init() {
      
      lv_pdf = (ListView) findViewById(R.id.lv_pdf);
      dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
      fn_permission();
      lv_pdf.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
      Intent intent = new Intent(getApplicationContext(), PdfActivity.class);
      intent.putExtra(“position”, i);
      startActivity(intent);
      
      Log.e(“Position”, i + “”);
      }
      });
      }
      
      public ArrayList<File> getfile(File dir) {
      File listFile[] = dir.listFiles();
      if (listFile != null && listFile.length > 0) {
      for (int i = 0; i < listFile.length; i++) {
      
      if (listFile[i].isDirectory()) {
      getfile(listFile[i]);
      
      } else {
      
      boolean booleanpdf = false;
      if (listFile[i].getName().endsWith(“.pdf”)) {
      
      for (int j = 0; j < fileList.size(); j++) {
      if (fileList.get(j).getName().equals(listFile[i].getName())) {
      booleanpdf = true;
      } else {
      
      }
      }
      
      if (booleanpdf) {
      booleanpdf = false;
      } else {
      fileList.add(listFile[i]);
      
      }
      }
      }
      }
      }
      return fileList;
      }
      private void fn_permission() {
      if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
      
      if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
      } else {
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
      REQUEST_PERMISSIONS);
      
      }
      } else {
      boolean_permission = true;
      
      getfile(dir);
      
      obj_adapter = new PDFAdapter(getApplicationContext(), fileList);
      lv_pdf.setAdapter(obj_adapter);
      
      }
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      if (requestCode == REQUEST_PERMISSIONS) {
      
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      
      boolean_permission = true;
      getfile(dir);
      
      obj_adapter = new PDFAdapter(getApplicationContext(), fileList);
      lv_pdf.setAdapter(obj_adapter);
      
      } else {
      Toast.makeText(getApplicationContext(), “Please allow the permission”, Toast.LENGTH_LONG).show();
      
      }
      }
      }
      
      }
      

      PdfActivity.java:

      package com.pdffilefromsdcard;
      
      import android.os.Bundle;
      import android.support.annotation.Nullable;
      import android.support.v7.app.AppCompatActivity;
      import android.util.Log;
      
      import com.github.barteksc.pdfviewer.PDFView;
      import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
      import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
      import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
      import com.shockwave.pdfium.PdfDocument;
      
      import java.io.File;
      import java.util.List;
      
      public class PdfActivity extends AppCompatActivity implements OnPageChangeListener,OnLoadCompleteListener {
      
      PDFView pdfView;
      Integer pageNumber = 0;
      String pdfFileName;
      String TAG=”PdfActivity”;
      int position=-1;
      
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_pdf);
      init();
      }
      
      private void init(){
      pdfView= (PDFView)findViewById(R.id.pdfView);
      position = getIntent().getIntExtra(“position”,-1);
      displayFromSdcard();
      }
      
      private void displayFromSdcard() {
      pdfFileName = MainActivity.fileList.get(position).getName();
      
      pdfView.fromFile(MainActivity.fileList.get(position))
      .defaultPage(pageNumber)
      .enableSwipe(true)
      
      .swipeHorizontal(false)
      .onPageChange(this)
      .enableAnnotationRendering(true)
      .onLoad(this)
      .scrollHandle(new DefaultScrollHandle(this))
      .load();
      }
      @Override
      public void onPageChanged(int page, int pageCount) {
      pageNumber = page;
      setTitle(String.format(“%s %s / %s”, pdfFileName, page + 1, pageCount));
      }
      @Override
      public void loadComplete(int nbPages) {
      PdfDocument.Meta meta = pdfView.getDocumentMeta();
      printBookmarksTree(pdfView.getTableOfContents(), “-“);
      
      }
      
      public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
      for (PdfDocument.Bookmark b : tree) {
      
      Log.e(TAG, String.format(“%s %s, p %d”, sep, b.getTitle(), b.getPageIdx()));
      
      if (b.hasChildren()) {
      printBookmarksTree(b.getChildren(), sep + “-“);
      }
      }
      }
      }
      

      【讨论】:

        【解决方案4】:

        看看Here

        如果您想要所有 PDF 文件,则更改文件扩展名,然后扩展名“.pdf”使用它从设备获取所有 PDF 文件。

        【讨论】:

          【解决方案5】:
          Found this method in my old project, this function will get you pdf and its info
          

          希望对你有帮助 **ManageFIleInfoForRecycler 是我的自定义类来存储文件信息**

          **“存储”传递为“外部”**

           public ArrayList<ManageFIleInfoForRecycler> fileList(String storage) {
                 ArrayList< ManageFIleInfoForRecycler > fileInfo = new ArrayList<>();
          //can give any file type "doc", "pdf" etc...
                  String pdf = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
                  int j=0;
          
          
          
                  Uri table = MediaStore.Files.getContentUri(storage);
          
                  //Column
                  String[] column = {MediaStore.Files.FileColumns.DATA,MediaStore.Files.FileColumns.TITLE};
                  //Where
                  String where = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
                  String[] args = new String[]{pdf};
          
                  Cursor fileCursor = getApplicationContext().getContentResolver().query(table, column, where, args, null);
          
                  String [] filesLists=new String[]{};
                  while (fileCursor.moveToNext()) {
                      int pathString= fileCursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
                      int nameIndex=fileCursor.getColumnIndex(MediaStore.Files.FileColumns.TITLE);
                      String path = fileCursor.getString(pathString);
                      String name=fileCursor.getString(nameIndex);
                    ManageFIleInfoForRecycler temp=new ManageFIleInfoForRecycler();
                    temp.filePath=path;
                    temp.fileName=name;
                      fileInfo.add(temp);
                  }
          return fileInfo;
          
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-04
            • 2012-12-26
            • 2021-11-08
            • 2012-01-02
            • 2014-04-09
            • 1970-01-01
            • 2021-05-11
            • 2014-05-26
            相关资源
            最近更新 更多