我正在创建一个应用程序,让用户上传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();
如果我从assets文件夹加载pdf,它运行良好。
我也试过了webview:
WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url)
我是Android的新手,我确信我做错了什么......如果有人能帮助我,我将非常感激。谢谢!
答案 0 :(得分:1)
AndroidPdfViewer
库支持从本地存储加载PDF文件,而不是从远程URL加载。由于您正在尝试加载远程链接,它不会显示任何内容。您需要在应用缓存中下载您的pdf文件并从该路径加载它
WebView
在这种情况下可以正常工作,因为它在浏览器中加载了一个远程网址
您可以参考以下问题HERE
答案 1 :(得分:1)
我没有使用Firebase,但我的PDF存储在服务器上。我使用Retrofit调用服务器将PDF下载为Stream。然后我将Stream提供给pdf Viewer
显示PDF
#pragma mark UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *img = nil;
CGRect cropRect = [[info valueForKey:UIImagePickerControllerCropRect] CGRectValue];
if (cropRect.origin.y < 0) {
img = [info objectForKey:UIImagePickerControllerOriginalImage];
} else {
img = [info objectForKey:UIImagePickerControllerEditedImage];
}
}
改造服务
private void displayPDF(InputStream stream) {
mPdfView.fromStream(stream)
.defaultPage(0)
.load();
}
在改造响应中
@Streaming
@GET
Call<ResponseBody> downloadPDF(@Url String url);
答案 2 :(得分:1)
我终于成功使用了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();
}
}
答案 3 :(得分:1)
这个也可以。
这是从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();
}
});
}
答案 4 :(得分:0)
在搜索并重试不同的代码后,我找到了解决方案。 无需在设备中下载即可查看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();
}
});
注意:当您在 firbase 存储中以编程方式保存 pdf 文件时,您需要保留 url 的文件名,因为您使用 name no url 检索文件