Android 如何实现PDF选择器

Android 如何实现PDF选择器

通过为Android应用程序添加PDF选择器,用户可以轻松选择并在应用程序内使用PDF文件。这个功能增强了用户体验,因为它允许无缝访问重要文档。要集成此功能,开发人员需要为PDF文件添加特定的文件选择器组件,使用户可以浏览设备存储并选择文件。然后他们可以查看、编辑或共享文档。通过简单的步骤,开发人员可以将此功能实现到他们的Android应用程序中,使用户更方便地与PDF文件交互。

PDF

便携式文档格式(PDF),更常称为PDF,是由Adobe Systems开发的一种广为认可的文件格式。它的目的是提供一种通用的表示文档的方式,不受任何软件、硬件或操作系统限制。PDF文件的独特之处在于它们能够在不同平台上统一地保留文档的布局、字体、格式和图像。这使得它们成为了全球范围内共享和浏览文档的理想介质。

PDF提供了高度的灵活性,可以包含各种元素,如文本、图像、超链接、表格、表单和多媒体。它们被广泛用于报告、合同、手册和电子书等领域。其中最重要的优势之一是平台无关性;用户可以通过利用PDF阅读器应用程序在运行不同操作系统的不同设备上访问和操作它们。

方法

要使用Java在Android应用程序中实现PDF选择器,可以采用几种方法。下面是三种常见的方法:

  • 使用Intent

  • 使用文件选择器库

  • 使用存储访问框架(Storage Access Framework,SAF)

使用Intent

此方法涉及使用动作ACTION_GET_CONTENT和MIME类型设置为application/pdf的Intent。这将打开系统文件选择器,允许用户选择PDF文件。在onActivityResult方法中接收结果后,您可以根据返回的数据检索所选的PDF文件。

步骤

  • 使用MIME类型为application/pdf的ACTION_GET_CONTENT意图。

  • 启动Intent,并在onActivityResult方法中处理结果以检索所选的PDF文件。

示例

//MainActivity.java
package com.example.volley;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

   private Button pickPdfButton;
   private TextView selectedPdfTextView;

   private ActivityResultLauncher<Intent> pdfPickerLauncher;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      pickPdfButton = findViewById(R.id.pick_pdf_button);
      selectedPdfTextView = findViewById(R.id.selected_pdf_text_view);

      pickPdfButton.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            openPdfPicker();
         }
      });

      pdfPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
            result -> {
               if (result.getResultCode() == Activity.RESULT_OK) {
                  Intent data = result.getData();
                  if (data != null) {
                     Uri pdfUri = data.getData();
                     String pdfName = getFileName(pdfUri);
                     selectedPdfTextView.setText(pdfName);
                     // Do something with the selected PDF file
                  }
               } else {
                  Toast.makeText(MainActivity.this, "No PDF selected", Toast.LENGTH_SHORT).show();
               }
            });
   }

   private void openPdfPicker() {
      Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
      intent.setType("application/pdf");
      pdfPickerLauncher.launch(intent);
   }

   private String getFileName(Uri uri) {
      String result = null;
      if (uri.getScheme().equals("content")) {
         try (Cursor cursor = getContentResolver().query(uri, null, null, null, null)) {
            if (cursor != null && cursor.moveToFirst()) {
               int columnIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
               if (columnIndex != -1) {
                  result = cursor.getString(columnIndex);
               }
            }
         }
      }
      if (result == null) {
         result = uri.getLastPathSegment();
      }
      return result;
   }
}

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <Button
      android:id="@+id/pick_pdf_button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Pick PDF"
      android:layout_centerInParent="true"/>

   <TextView
      android:id="@+id/selected_pdf_text_view"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="16sp"
      android:layout_below="@id/pick_pdf_button"
      android:layout_marginTop="16dp"
      android:layout_centerHorizontal="true"/>

</RelativeLayout>

输出

Android 如何实现PDF选择器

使用文件选择库

这种方法需要将文件选择库集成到您的Android项目中,例如android-filepicker、TedPicker或MaterialFilePicker。这些库提供了预先构建的组件,允许您显示和过滤文件,包括PDF文件。通过配置库并实现必要的回调,您可以从用户的文件选择中获取所选的PDF文件。

步骤

  • 将文件选择库(如android-filepicker、TedPicker或MaterialFilePicker)集成到您的项目中。

  • 配置库以仅显示和过滤PDF文件。

  • 实现必要的回调或监听器以获得所选的PDF文件。

示例

// Step 1: Add the file picker library to your project's dependencies
implementation 'com.github.jaiselrahman:FilePicker:2.4.1'

// Step 2: Request the necessary permissions in your AndroidManifest.xml file
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

// Step 3: Create a button in your layout file to trigger the PDF picker
<Button
   android:id="@+id/btnPickPDF"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Pick PDF" />

// Step 4: In your activity or fragment, initialize the file picker library
FilePicker filePicker = new FilePicker(this);

// Step 5: Set the file types to be picked (in this case, PDF files)
filePicker.setFileTypes(new String[]{".pdf"});

// Step 6: Set the file picker listener to handle the selected PDF file
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.nbsp.materialfilepicker.MaterialFilePicker;
import com.nbsp.materialfilepicker.ui.FilePickerActivity;

import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {

   private static final int PERMISSION_REQUEST_CODE = 1;

   private Button btnPickPDF;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      btnPickPDF = findViewById(R.id.btnPickPDF);
      btnPickPDF.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            checkPermissionsAndPickFile();
         }
      });
   }

   private void checkPermissionsAndPickFile() {
      if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(this,
               new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
               PERMISSION_REQUEST_CODE);
      } else {
         startFilePicker();
      }
   }

   private void startFilePicker() {
      new MaterialFilePicker()
            .withActivity(this)
            .withRequestCode(PERMISSION_REQUEST_CODE)
            .withFilter(Pattern.compile(".*\.pdf$"))
            .withHiddenFiles(true)
            .start();
   }

   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions, @NonNull int[] grantResults) {
      if (requestCode == PERMISSION_REQUEST_CODE) {
         if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startFilePicker();
         } else {
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
         }
      }
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == PERMISSION_REQUEST_CODE && resultCode == RESULT_OK) {
         String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
         if (filePath != null) {
            // Handle the selected PDF file here
            // You can perform operations like displaying the file name or opening the file
            File file = new File(filePath);
            // Do something with the file
         }
      }
   }
}

输出

Android 如何实现PDF选择器

使用存储访问框架(SAF)

要在您的应用中开始选择PDF文件,第一步是通过应用清单请求READ_EXTERNAL_STORAGE权限。之后,使用Intent.ACTION_OPEN_DOCUMENT意图启动文件选择器系统,专门用于PDF文件。一旦您从onActivityResult方法中收到结果,访问所选PDF的URI以执行其他操作。

步骤

  • 在您的应用的清单中请求READ_EXTERNAL_STORAGE权限。

  • 使用Intent.ACTION_OPEN_DOCUMENT意图允许用户使用系统的文件选择器选择PDF文件。

  • 在onActivityResult方法中处理结果,以获取所选PDF文件的URI。

示例

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

   private static final int REQUEST_CODE_PICK_PDF = 1;

   private Button pickPdfButton;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      pickPdfButton = findViewById(R.id.pick_pdf_button);
      pickPdfButton.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.setType("application/pdf");
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(intent, REQUEST_CODE_PICK_PDF);
         }
      });
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == REQUEST_CODE_PICK_PDF && resultCode == RESULT_OK) {
         if (data != null) {
            Uri uri = data.getData();
            if (uri != null) {
               String pdfPath = getPathFromUri(uri);
               // Do something with the selected PDF file path
            }
         }
      }
   }

   private String getPathFromUri(Uri uri) {
      String path = null;
      if (DocumentsContract.isDocumentUri(this, uri)) {
         String documentId = DocumentsContract.getDocumentId(uri);
         if (documentId.startsWith("raw:")) {
            path = documentId.substring(4);
         } else {
            String[] split = documentId.split(":");
            if (split.length >= 2) {
               String type = split[0];
               String id = split[1];
               Uri contentUri = null;
               if ("primary".equalsIgnoreCase(type)) {
                  contentUri = Uri.parse("content://media/external/file/" + id);
               } else {
                  contentUri = Uri.parse("content://com.android.externalstorage.documents/document/" + id);
               }
               String[] projection = {DocumentsContract.MediaColumns.DATA};
               Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
               if (cursor != null && cursor.moveToFirst()) {
                  int columnIndex = cursor.getColumnIndexOrThrow(DocumentsContract.MediaColumns.DATA);
                  path = cursor.getString(columnIndex);
                  cursor.close();
               }
            }
         }
      }
      return path;
   }
}

输出

Android 如何实现PDF选择器

结论

在本教程中,Android应用程序中实现PDF选择器让用户可以方便地选择和操作应用内的PDF文件。通过集成使用意图、文件选择器库或存储访问框架等方法,开发人员可以为访问和处理PDF文档提供无缝和用户友好的体验。无论是通过系统文件选择器、自定义文件选择对话框还是URI检索,选择的方法都可以根据应用的具体要求进行调整,以提升处理PDF文件的整体功能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程