Как использовать pdfviewer для отображения PDF из Firebase в Android Studio
Я делаю приложение, которое позволяет пользователю загружать файлы PDF, а затем я сохраняю их в Firebase. Сейчас я пытаюсь отобразить их в своем приложении, я не хочу, чтобы пользователь мог загрузить файл, но я хочу, чтобы он отображался прямо в приложении.
Вот как я сохраняю файлы:
private void uploadFile() {
progressBar.setVisibility(View.VISIBLE);
StorageReference sRef = mStorageReference.child(Constants.STORAGE_PATH_COURSES + System.currentTimeMillis() + ".pdf");
sRef.putFile(filepath)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@SuppressWarnings("VisibleForTests")
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressBar.setVisibility(View.GONE);
textViewStatus.setText("File Uploaded Successfully");
Course upload = new Course(editTextFilename.getText().toString(), taskSnapshot.getDownloadUrl().toString());
mDatabaseReference.child(mDatabaseReference.push().getKey()).setValue(upload);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@SuppressWarnings("VisibleForTests")
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
textViewStatus.setText((int) progress + "% Uploading...");
}
});
}
Я искал возможности и попробовал несколько, но я не могу заставить их работать.
Я пытался использовать это, но ничего не отображается. https://github.com/barteksc/AndroidPdfViewer
pdfView=(PDFView) findViewById(R.id.pdfView);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
url = getIntent().getStringExtra("url");
}
uri=Uri.parse(url);
pdfView.fromUri(uri).load();
Если я загружаю PDF из папки ресурсов, он работает хорошо.
Я также попробовал веб-просмотр:
WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url)
Я действительно новичок в Android, и я уверен, что я делаю что-то не так... Я был бы очень благодарен, если бы кто-то мог мне помочь. Спасибо!
5 ответов
AndroidPdfViewer
Библиотека поддерживает загрузку PDF-файла из локального хранилища, а не из удаленного URL-адреса. Так как вы пытаетесь загрузить удаленную ссылку, она ничего не показывает. Вам нужно скачать pdf-файл в кеш приложения и загрузить его по этому пути.
WebView
будет нормально работать в этой ситуации, потому что его загрузка удаленного URL в браузере
Вы можете обратиться к следующей проблеме ЗДЕСЬ
Мне наконец удалось использовать PDFViewer. Вот мой код:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course);
pdfView=(PDFView) findViewById(R.id.pdfView);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
url = getIntent().getStringExtra("url");
}
new RetrievePDFStream().execute(url);
}
class RetrievePDFStream extends AsyncTask<String,Void,InputStream>{
@Override
protected InputStream doInBackground(String... strings) {
InputStream inputStream=null;
try{
URL urlx=new URL(strings[0]);
HttpURLConnection urlConnection=(HttpURLConnection) urlx.openConnection();
if(urlConnection.getResponseCode()==200){
inputStream=new BufferedInputStream(urlConnection.getInputStream());
}
}catch (IOException e){
return null;
}
return inputStream;
}
@Override
protected void onPostExecute(InputStream inputStream) {
pdfView.fromStream(inputStream).load();
}
}
Это действительно помогло: https://www.youtube.com/watch?v=-Ld1IoOF_uk
Я не использую Firebase, но мой PDF хранится на сервере. Я звоню на сервер, используя Retrofit, чтобы загрузить PDF в виде потока. Тогда я даю поток в PDF Viewer
Для отображения PDF
private void displayPDF(InputStream stream) {
mPdfView.fromStream(stream)
.defaultPage(0)
.load();
}
Модернизация Сервис
@Streaming
@GET
Call<ResponseBody> downloadPDF(@Url String url);
В ответ на модификацию
displayPDF(responseBody.byteStream());
Этот тоже работает.
Это с веб-сайта Firebase Doc:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Write a message to the database
pdfView = (PDFView) findViewById(R.id.pdfView);
mFirebaseStorage=FirebaseStorage.getInstance();
mmFirebaseStorageRef=mFirebaseStorage.getReference().child("sources");
final long ONE_MEGABYTE = 1024 * 1024;
mmFirebaseStorageRef.child("smpl.pdf").getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
pdfView.fromBytes(bytes).load();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this,"download unsuccessful",Toast.LENGTH_LONG).show();
}
});
}
после поиска и повторения разных кодов я нашел решение. просматривать PDF-файл без загрузки на устройство
Библиотека для просмотра pdf есть
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
Добавить в XML
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfview"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
и это Java-код
StorageReference storageRef;
FirebaseApp app;
FirebaseStorage storage;
storageRef = FirebaseStorage.getInstance().getReference();
app = FirebaseApp.getInstance();
storage = FirebaseStorage.getInstance(app);
storageRef = storage.getReference().child("books/booksPDF/documenttcv.pdf");
storageRef.getStream().addOnSuccessListener(new OnSuccessListener<StreamDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(StreamDownloadTask.TaskSnapshot taskSnapshot) {
pdfview.fromStream(taskSnapshot.getStream()).load();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(ReadBookActivity.this, "Fail :"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ПРИМЕЧАНИЕ. Когда вы программно сохраняете файл pdf в хранилище firbase, вам необходимо сохранить имя файла без URL-адреса, потому что вы извлекаете файлы, используя имя без URL-адреса.