如何在Android中實現PDF選擇器?


透過向Android應用程式新增PDF選擇器,使用者可以輕鬆地在應用程式中選擇和處理PDF檔案。此功能增強了使用者體驗,因為它允許無縫訪問重要文件。為了整合此功能,開發人員需要新增一個專門用於PDF檔案的特定檔案選擇器元件,該元件使使用者能夠瀏覽裝置儲存並選擇檔案。然後,他們可以檢視、編輯或共享文件。透過遵循簡單的步驟,開發人員可以將此功能實現到他們的Android應用程式中,從而使使用者更方便地與PDF檔案互動。

PDF

可移植文件格式,通常稱為PDF,是由Adobe Systems開發的一種廣為認可的檔案格式。其目的是提供一種通用的方式來表示文件,不受任何軟體、硬體或作業系統的限制。PDF檔案的獨特之處在於它能夠在不同的平臺上統一地保留文件的佈局、字型、格式和影像。這使其成為在全球範圍內共享和檢視文件的理想媒介。

PDF具有很高的通用性,可以包含各種元素,例如文字、影像、超連結、表格、表單和多媒體。它們廣泛用於報告、合同、手冊、說明書和電子書。它們最重要的優點之一是平臺無關性;使用者可以透過使用PDF閱讀器應用程式在執行各種作業系統的不同裝置上訪問和與它們互動。

方法

要使用Java在Android應用程式中實現PDF選擇器,您可以遵循幾種方法。以下是三種常見的方法

  • 使用Intent

  • 使用檔案選擇器庫

  • 使用儲存訪問框架 (SAF)

使用Intent

此方法涉及啟動一個intent,其操作為ACTION_GET_CONTENT,MIME型別設定為application/pdf。這將開啟系統檔案選擇器,允許使用者選擇PDF檔案。在onActivityResult方法中接收結果後,您可以根據返回的資料檢索選定的PDF檔案。

演算法

  • 使用MIME型別設定為application/pdf的ACTION_GET_CONTENT intent。

  • 啟動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-filepicker、TedPicker或MaterialFilePicker)整合到您的Android專案中。這些庫提供預構建的元件,允許您顯示和過濾檔案,包括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
         }
      }
   }
}

輸出

使用儲存訪問框架 (SAF)

要在您的應用程式中開始選擇PDF檔案,第一步是透過應用程式清單請求READ_EXTERNAL_STORAGE許可權。之後,使用Intent.ACTION_OPEN_DOCUMENT intent(專門用於PDF)啟動檔案選擇器系統。從onActivityResult方法接收結果後,訪問所選PDF的URI以對其執行其他操作。

演算法

  • 首先在您的應用程式清單中請求READ_EXTERNAL_STORAGE許可權。

  • 使用Intent.ACTION_OPEN_DOCUMENT intent允許使用者使用系統的檔案選擇器選擇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選擇器允許使用者方便地在應用程式中選擇和互動PDF檔案。透過整合使用intent、檔案選擇器庫或儲存訪問框架等方法,開發人員可以為訪問和處理PDF文件提供無縫且使用者友好的體驗。無論是透過系統檔案選擇器、自定義檔案選擇器對話方塊還是URI檢索,所選擇的方法都可以根據應用程式的具體要求進行調整,並增強處理PDF檔案的整體功能。

更新於:2023年7月26日

2K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告