📌  相关文章
📜  如何在Android的Firebase实时数据库中检索PDF文件?

📅  最后修改于: 2021-05-13 15:39:09             🧑  作者: Mango

当我们创建一个android应用程序时,而不是手动插入pdf,我们希望使用Firebase上的Internet来获取pdf。 Firebase Realtime Database是Google提供的后端服务,用于处理您的Android应用,IOS应用以及您的网站的后端任务。它提供了许多服务,例如存储,数据库等等。 Firebase著名的功能是其Firebase实时数据库。通过在您的应用程序中使用Firebase实时数据库,您可以向用户提供实时数据更新,而无需实际刷新您的应用程序。我们将创建存储桶,我们可以在其中插入pdf文件,并将其直接添加到我们的应用程序中。

我们将在本文中构建什么?

我们将在该项目中创建两个活动。在一个活动中,将有一个按钮,而在另一活动中,我们正在查看pdf文件。因此,当用户单击按钮时,将显示一个AlertBox,其中带有“ Download ”(下载),“ View ”(查看)和“ Cancel ”(取消)选项。因此,用户将选择是否要查看或下载pdf。下面提供了一个示例视频,以使您对本文中的工作有个大概的了解。注意,我们将使用Java语言实现该项目。

分步实施

步骤1:创建一个新项目

要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。

第2步:将您的应用连接到Firebase

创建新项目后,导航至顶部栏上的“工具”选项。在里面单击Firebase。单击Firebase后,您可以在屏幕快照中看到下面提到的右列。

在该列内,导航到Firebase实时数据库。单击该选项,您将在“将应用程序连接到Firebase”和“将Firebase实时数据库添加到您的应用程序”中看到两个选项。单击立即连接,您的应用程序将连接到Firebase。之后,单击第二个选项,现在您的应用已连接到Firebase。

完成此过程后,您将看到以下屏幕。

现在,验证您的应用是否已连接到Firebase。转到您的build.gradle文件。导航至应用程序> Gradle脚本> build.gradle文件,并确保在依赖项部分中添加了以下依赖项。

如果上述依赖项未添加到“依赖项”部分中。添加此依赖性并同步您的项目。现在,我们将转向应用程序的XML部分。另外,添加以下依赖项。

现在,同步将同步现在右上角的选择项目。

步骤3:在AndroidManifest.xml文件中添加Internet权限

导航到AndroidManifest.xml文件,并添加以下权限以在应用程序中获得Internet权限。

步骤4:使用activity_main.xml文件

转到activity_main.xml文件,并参考以下代码。以下是activity_main.xml文件的代码。

XML


  
    
    


Java
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
  
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
  
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
  
public class MainActivity extends AppCompatActivity {
  
    Button view;
    DatabaseReference database;
    String message;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = findViewById(R.id.view);
          
        // Initialising the reference to database
        database = FirebaseDatabase.getInstance().getReference().child("pdf");
        database.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // getting a DataSnapshot for the location at the specified
                // relative path and getting in the link variable
                message = dataSnapshot.getValue(String.class);
            }
  
            // this will called when any problem
            // occurs in getting data
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // we are showing that error message in toast
                Toast.makeText(MainActivity.this, "Error Loading Pdf", Toast.LENGTH_SHORT).show();
            }
        });
        // After clicking here alert box will come
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                CharSequence options[] = new CharSequence[]{
                        "Download",
                        "View",
                        "Cancel"
                };
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle("Choose One");
                builder.setItems(options, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // we will be downloading the pdf
                        if (which == 0) {
                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(message));
                            startActivity(intent);
                        }
                        // We will view the pdf
                        if (which == 1) {
                            Intent intent = new Intent(v.getContext(), ViewPdfActivity.class);
                            intent.putExtra("url", message);
                            startActivity(intent);
                        }
                    }
                });
                builder.show();
            }
        });
    }
}


XML


  
    
      


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
  
import com.github.barteksc.pdfviewer.PDFView;
  
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
  
public class ViewPdfActivity extends AppCompatActivity {
  
    String urls;
    PDFView pdfView;
    ProgressDialog dialog;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pdf);
        pdfView = findViewById(R.id.abc);
          
        // Firstly we are showing the progress 
        // dialog when we are loading the pdf
        dialog = new ProgressDialog(this);
        dialog.setMessage("Loading..");
        dialog.show();
          
        // getting url of pdf using getItentExtra
        urls = getIntent().getStringExtra("url");
        new RetrivePdfStream().execute(urls);
    }
  
    // Retrieving the pdf file using url
    class RetrivePdfStream extends AsyncTask {
  
        @Override
        protected InputStream doInBackground(String... strings) {
            InputStream inputStream = null;
            try {
                  
                // adding url
                URL url = new URL(strings[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                  
                // if url connection response code is 200 means ok the execute
                if (urlConnection.getResponseCode() == 200) {
                    inputStream = new BufferedInputStream(urlConnection.getInputStream());
                }
            }
            // if error return null
            catch (IOException e) {
                return null;
            }
            return inputStream;
        }
  
        @Override
        // Here load the pdf and dismiss the dialog box
        protected void onPostExecute(InputStream inputStream) {
            pdfView.fromStream(inputStream).load();
            dialog.dismiss();
        }
    }
}


步骤5:使用MainActivity。 Java文件

转到MainActivity。 Java文件并参考以下代码。下面是MainActivity的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。

Java

import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
  
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
  
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
  
public class MainActivity extends AppCompatActivity {
  
    Button view;
    DatabaseReference database;
    String message;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = findViewById(R.id.view);
          
        // Initialising the reference to database
        database = FirebaseDatabase.getInstance().getReference().child("pdf");
        database.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // getting a DataSnapshot for the location at the specified
                // relative path and getting in the link variable
                message = dataSnapshot.getValue(String.class);
            }
  
            // this will called when any problem
            // occurs in getting data
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // we are showing that error message in toast
                Toast.makeText(MainActivity.this, "Error Loading Pdf", Toast.LENGTH_SHORT).show();
            }
        });
        // After clicking here alert box will come
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                CharSequence options[] = new CharSequence[]{
                        "Download",
                        "View",
                        "Cancel"
                };
                AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle("Choose One");
                builder.setItems(options, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // we will be downloading the pdf
                        if (which == 0) {
                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(message));
                            startActivity(intent);
                        }
                        // We will view the pdf
                        if (which == 1) {
                            Intent intent = new Intent(v.getContext(), ViewPdfActivity.class);
                            intent.putExtra("url", message);
                            startActivity(intent);
                        }
                    }
                });
                builder.show();
            }
        });
    }
}

步骤6:建立新的ViewpdfActivity类别

请参考如何在Android Studio中创建新活动并将该活动命名ViewpdfActivity 。此活动用于查看pdf文件。

步骤7:使用activity_view_pdf.xml文件

导航至应用程序> res>布局> activity_view_pdf.xml,然后将以下代码添加到该文件中。以下是activity_view_pdf.xml文件的代码

XML格式



  
    
      

步骤8:使用ViewpdfActivity。 Java文件

转到ViewpdfActivity。 Java文件并参考以下代码。下面是ViewpdfActivity的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
  
import com.github.barteksc.pdfviewer.PDFView;
  
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
  
public class ViewPdfActivity extends AppCompatActivity {
  
    String urls;
    PDFView pdfView;
    ProgressDialog dialog;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pdf);
        pdfView = findViewById(R.id.abc);
          
        // Firstly we are showing the progress 
        // dialog when we are loading the pdf
        dialog = new ProgressDialog(this);
        dialog.setMessage("Loading..");
        dialog.show();
          
        // getting url of pdf using getItentExtra
        urls = getIntent().getStringExtra("url");
        new RetrivePdfStream().execute(urls);
    }
  
    // Retrieving the pdf file using url
    class RetrivePdfStream extends AsyncTask {
  
        @Override
        protected InputStream doInBackground(String... strings) {
            InputStream inputStream = null;
            try {
                  
                // adding url
                URL url = new URL(strings[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                  
                // if url connection response code is 200 means ok the execute
                if (urlConnection.getResponseCode() == 200) {
                    inputStream = new BufferedInputStream(urlConnection.getInputStream());
                }
            }
            // if error return null
            catch (IOException e) {
                return null;
            }
            return inputStream;
        }
  
        @Override
        // Here load the pdf and dismiss the dialog box
        protected void onPostExecute(InputStream inputStream) {
            pdfView.fromStream(inputStream).load();
            dialog.dismiss();
        }
    }
}

第9步:在Firebase存储上添加pdf并复制该pdf的链接

在firebase中,转到“存储”选项,然后单击“入门”按钮

之后,单击“上传文件”选项以在Firebase存储上插入pdf。

之后,单击您插入的pdf,然后pdf部分中将显示来自pdf的详细信息,然后单击访问令牌并复制pdf URL。

步骤10:将该pdf URL添加到实时数据库中

转到“实时数据库”选项,然后将这些值添加到数据库。在该屏幕内,单击左侧窗口中的“实时数据库”。

单击此选项后,您将看到右侧的屏幕。在此页面上,单击顶部栏中的“规则”选项。您将看到以下屏幕。

在此项目中,我们添加了适用于读取和写入的规则,因为我们没有使用任何身份验证来验证用户。因此,我们目前将其设置为true以测试我们的应用程序。更改规则后。单击右上角的“发布”按钮,您的规则将保存在此处。现在再次回到“数据”选项卡。现在,我们将从Firebase本身将数据手动添加到Firebase。在Firebase的“数据”选项卡中,您将看到以下屏幕。将光标悬停在null上,然后单击右侧的“ +”选项,然后单击该选项。单击该选项后。添加下图中添加的数据。确保将“ pdf”添加到“名称”字段中,因为我们将Firebase的参考设置为“ pdf”。因此,我们必须将其设置为“ pdf”。您可以更改参考,也可以在数据库中对其进行更改。在值字段内,粘贴复制的pdf网址。这将是我们要我们的pdfview内显示的字符串。添加数据后,单击添加按钮,您的数据将被添加到Firebase中,并且该数据将显示在您的应用中。

输出: