如何使用 AndroidPdfViewer 库显示存储中的 pdf 文件?
How to show a pdf file from storage using AndroidPdfViewer library?
我想使用 AndroidPdfViewer 从外部存储 (Download/Pdfs/myfile.pdf) 加载 pdf 文件,但它显示空白屏幕,没有任何错误。试了很多方法都不行。
public class PdfViewActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromFile(path).load();
我的“Download/Pdfs/myfile.pdf”中有一个 pdf 文件,我使用上面的代码加载了该文件,但它不起作用。
我已从设置中手动授予存储权限。
谁能纠正我的错误。
首先,将库添加到您的 build.gradle 文件
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
要从存储中打开 PDF 文件,请使用此代码。有评论解释了它的作用。
public class PdfViewActivity2 extends AppCompatActivity {
// Declare PDFView variable
private PDFView pdfView;
private final int PDF_SELECTION_CODE = 99;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize it
pdfView = findViewById(R.id.pdfView);
// Select PDF from storage
// This code can be used in a button
Toast.makeText(this, "selectPDF", Toast.LENGTH_LONG).show();
Intent browseStorage = new Intent(Intent.ACTION_GET_CONTENT);
browseStorage.setType("application/pdf");
browseStorage.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(browseStorage, "Select PDF"), PDF_SELECTION_CODE);
}
// Get the Uniform Resource Identifier (Uri) of your data, and receive it as a result.
// Then, use URI as the pdf source and pass it as a parameter inside this method fromUri(Uri uri)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PDF_SELECTION_CODE && resultCode == Activity.RESULT_OK && data != null) {
Uri selectedPdfFromStorage = data.getData();
pdfView.fromUri(selectedPdfFromStorage).defaultPage(0).load();
}
}
}
在 Android 10 台设备中,您的应用无法访问外部存储。
除非你添加
android:requestLegacyExternalStorage="true"
在清单文件的应用程序标签中。
不使用 fromFile(),而是使用 fromSource()。即声明 pathe 为 DocumentSource 而不是 File。
public class PdfViewActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DocumentSource path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromSource(path).load();
我已经测试了您的代码,它在 Android 10 设备上运行良好。您缺少以下内容:
1.In Android 清单文件添加 READ_EXTERNAL_STORAGE 权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
并在应用程序标签内部将 requestLegacyExternalStorage 添加为 true 以便能够访问 Android 10 台及以上设备上的外部存储。
<application
android:requestLegacyExternalStorage="true"
2.Verify pdf 存在于“/Download/Pdfs/myfile.pdf”路径下的设备上。
3.Change 您的 activity 通过在运行时首先在 onCreate 方法中请求外部存储权限来使用以下代码:
public class PdfViewActivity2 extends AppCompatActivity {
private static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//check if Read External Storage permission was granded
boolean granded = checkPermissionForReadExtertalStorage();
if(!granded){
requestPermissionForReadExtertalStorage();
}
else {
readPdf();
}
}
public boolean checkPermissionForReadExtertalStorage() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int result = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
return result == PackageManager.PERMISSION_GRANTED;
}
return false;
}
public void requestPermissionForReadExtertalStorage() {
try {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_STORAGE_PERMISSION_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case READ_STORAGE_PERMISSION_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted. Read Pdf from External Storage
readPdf();
} else {
// permission denied. Disable the functionality that depends on this permission.
}
}
}
}
private void readPdf(){
File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromFile(path).load();
}
}
我想使用 AndroidPdfViewer 从外部存储 (Download/Pdfs/myfile.pdf) 加载 pdf 文件,但它显示空白屏幕,没有任何错误。试了很多方法都不行。
public class PdfViewActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromFile(path).load();
我的“Download/Pdfs/myfile.pdf”中有一个 pdf 文件,我使用上面的代码加载了该文件,但它不起作用。 我已从设置中手动授予存储权限。 谁能纠正我的错误。
首先,将库添加到您的 build.gradle 文件
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
要从存储中打开 PDF 文件,请使用此代码。有评论解释了它的作用。
public class PdfViewActivity2 extends AppCompatActivity {
// Declare PDFView variable
private PDFView pdfView;
private final int PDF_SELECTION_CODE = 99;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize it
pdfView = findViewById(R.id.pdfView);
// Select PDF from storage
// This code can be used in a button
Toast.makeText(this, "selectPDF", Toast.LENGTH_LONG).show();
Intent browseStorage = new Intent(Intent.ACTION_GET_CONTENT);
browseStorage.setType("application/pdf");
browseStorage.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(browseStorage, "Select PDF"), PDF_SELECTION_CODE);
}
// Get the Uniform Resource Identifier (Uri) of your data, and receive it as a result.
// Then, use URI as the pdf source and pass it as a parameter inside this method fromUri(Uri uri)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PDF_SELECTION_CODE && resultCode == Activity.RESULT_OK && data != null) {
Uri selectedPdfFromStorage = data.getData();
pdfView.fromUri(selectedPdfFromStorage).defaultPage(0).load();
}
}
}
在 Android 10 台设备中,您的应用无法访问外部存储。
除非你添加
android:requestLegacyExternalStorage="true"
在清单文件的应用程序标签中。
不使用 fromFile(),而是使用 fromSource()。即声明 pathe 为 DocumentSource 而不是 File。
public class PdfViewActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DocumentSource path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromSource(path).load();
我已经测试了您的代码,它在 Android 10 设备上运行良好。您缺少以下内容:
1.In Android 清单文件添加 READ_EXTERNAL_STORAGE 权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
并在应用程序标签内部将 requestLegacyExternalStorage 添加为 true 以便能够访问 Android 10 台及以上设备上的外部存储。
<application
android:requestLegacyExternalStorage="true"
2.Verify pdf 存在于“/Download/Pdfs/myfile.pdf”路径下的设备上。
3.Change 您的 activity 通过在运行时首先在 onCreate 方法中请求外部存储权限来使用以下代码:
public class PdfViewActivity2 extends AppCompatActivity {
private static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//check if Read External Storage permission was granded
boolean granded = checkPermissionForReadExtertalStorage();
if(!granded){
requestPermissionForReadExtertalStorage();
}
else {
readPdf();
}
}
public boolean checkPermissionForReadExtertalStorage() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int result = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
return result == PackageManager.PERMISSION_GRANTED;
}
return false;
}
public void requestPermissionForReadExtertalStorage() {
try {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_STORAGE_PERMISSION_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case READ_STORAGE_PERMISSION_REQUEST_CODE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted. Read Pdf from External Storage
readPdf();
} else {
// permission denied. Disable the functionality that depends on this permission.
}
}
}
}
private void readPdf(){
File path = new File(Environment.getExternalStorageDirectory().getPath() + "/Download/Pdfs/myfile.pdf");
PDFView pdfView = findViewById(R.id.pdfView);
pdfView.fromFile(path).load();
}
}