บทเรียนต่อเนื่องสำหรับสร้าง Comic Book ด้วย Firebase บน Android เพื่อสร้างแอปพลิเคชันอ่านหนังสือ PDF อย่างง่ายและจัดการด้วย Firebase ตอนที่ 2
ศึกษาบทความก่อนหน้า: Android Studio กับการทำระบบ Bookshelf ร่วมกับ Firebase เบื้องต้น ตอนที่ 1
สำหรับคนที่ไม่อยากโหลด PDF แต่มีภาพ Image หลายๆ ภาพให้ไปที่บทเรียนที่ 3 เลยข้ามบทที่ 2 ไป
บทเรียนตอนที่ 3: Android Studio กับการทำระบบ Bookshelf ร่วมกับ Firebase เบื้องต้น ตอนที่ 3
เราจะได้หน้าจอการทำงานของแอปพลิเคชันเราดังนี้:
ขั้นตอนต่อมาให้เราเตรียมไฟล์ PDF การ์ตูนของเราไม่เกิน 65 mb นะครับ อัพโหลดขึ้นไปบน Storage ของ Firebase หลังจากนั้นให้เปลี่ยนโครงสร้างของ Real-Time Database เราใหม่ให้เป็นดังนี้:
คือการนำ Download Location ของ Firebase Storage ไฟล์ PDF ไปวางที่ key ตัวใหม่ตั้งชื่อว่า “files” ส่วนโครงสร้างของ JSON จะเป็นดังนี้:
https://enet5-7f9f6.firebaseio.com/bookshelf.json
แปลว่าเราจะมี PDF อยู่ในรายการข้อมูล Real-Time Database ของเราเรียบร้อยแล้ว ต่อมากลับไปที่ Project ของเราอีกครั้ง ให้ทำการเพิ่ม Empty Activity ขึ้นมาใหม่ว่า “ReadActivity.java”
เปิดไฟล์ acivity_read.xml ขึ้นมาใส่ WebView เข้าไปตั้งชื่อ ID ว่า pdfView โครงสร้าง XML ดังนี้:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ReadActivity"> <WebView android:id="@+id/pdfView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="1dp" android:layout_marginEnd="1dp" android:layout_marginLeft="1dp" android:layout_marginRight="1dp" android:layout_marginStart="1dp" android:layout_marginTop="1dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
เปิดไฟล์ DataModel.java ขึ้นมา แก้ไขไฟล์จากเดิมคือ
import java.util.HashMap; import java.util.Map; public class DataModel { String title,desc,photos,key; public DataModel(){ } public DataModel(String title, String desc, String photos, String key) { this.title = title; this.desc = desc; this.photos = photos; this.key = key; } public Map<String, Object> toMap(){ HashMap<String, Object> result = new HashMap<>(); result.put("title",title); result.put("content",desc); result.put("photos",photos); result.put("key",key); return result; } }
แก้ไขเป็น
import java.util.HashMap; import java.util.Map; public class DataModel { String title,desc,photos,key,files; public DataModel(){ } public DataModel(String title, String desc, String photos, String key, String files) { this.title = title; this.desc = desc; this.photos = photos; this.key = key; this.files = files; } public Map<String, Object> toMap(){ HashMap<String, Object> result = new HashMap<>(); result.put("title",title); result.put("content",desc); result.put("photos",photos); result.put("key",key); result.put("files",files); return result; } }
เพิ่ม Key ของ files เข้าไปนั่นเอง หลังจากนั้นเปิดไฟล์ DataAdapter.java ขึ้นมา แก้ไขส่วนของ เมธอด onBindViewHolder() เพิ่มคำสั่งต่อไปนี้เข้าไป:
dataViewHolder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String filePath = dataModel.files; Log.d(TAG, "filePath=" + filePath); Intent readActivity = new Intent(v.getContext(),ReadActivity.class); readActivity.putExtra("filePath",filePath); readActivity.putExtra("title",dataModel.title); v.getContext().startActivity(readActivity); } });
เป็นการสร้าง Intent โดยส่งค่า files ที่เก็บอยู่ใน Firebase คือ Path ของไฟล์ PDF ไปผ่าน Intent ดังนั้นตรวจสอบไฟล์ DataAdapter.java ได้ดังนี้:
import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.List; public class DataAdapter extends RecyclerView.Adapter<DataAdapter.DataViewHolder> { private static final String TAG = "FireComic"; private List<DataModel> dataModelList; private DataModel dataModel; public DataAdapter(List<DataModel> result) { this.dataModelList = result; } @Override public DataAdapter.DataViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return new DataViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.content_read,viewGroup,false)); } @Override public void onBindViewHolder(final DataViewHolder dataViewHolder, final int i) { dataModel = dataModelList.get(i); dataViewHolder.textTitle.setText(dataModel.title); Picasso.get().load(dataModel.photos) .error(R.mipmap.ic_launcher) .placeholder(R.mipmap.ic_launcher) .into(dataViewHolder.imageView); dataViewHolder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String filePath = dataModel.files; Log.d(TAG, "filePath=" + filePath); Intent readActivity = new Intent(v.getContext(),ReadActivity.class); readActivity.putExtra("filePath",filePath); readActivity.putExtra("title",dataModel.title); v.getContext().startActivity(readActivity); } }); } @Override public int getItemCount() { return dataModelList.size(); } public class DataViewHolder extends RecyclerView.ViewHolder { TextView textTitle; ImageView imageView; public DataViewHolder(final View itemView) { super(itemView); textTitle = itemView.findViewById(R.id.title); imageView = itemView.findViewById(R.id.thumbnail); } } }
หลังจากนั้นให้เราไปเปิด ไฟล์คลาสของ ReadActivity.java ขึ้นมา ประกาศตัวแปร Global ดังนี้:
private WebView pdfView; private String txt_file_path;
เพิ่มคำสั่งรับค่า Intent โดยเก็บ Parameter ไว้ในตัวแปร txt_file_path
Intent intent= getIntent(); txt_file_path = intent.getStringExtra("filePath"); pdfView = (WebView)findViewById(R.id.pdfView); pdfView.setVisibility(WebView.VISIBLE); WebSettings webSettings = pdfView.getSettings(); webSettings.setJavaScriptEnabled(true); pdfView.loadUrl("https://docs.google.com/gview?embedded=true&url="+txt_file_path);
สำหรับ Basic PDF Reader นั้นให้เราใช้ Embedded API ของ Google Docs ต่อ Parameter เราก็จะได้วิธีการโหลด PDF ลงใน WebView ดังนั้นไฟล์ ReadActivity.java จะเป็นดังนี้:
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; public class ReadActivity extends AppCompatActivity { private WebView pdfView; private String txt_file_path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_read); Intent intent= getIntent(); txt_file_path = intent.getStringExtra("filePath"); pdfView = (WebView)findViewById(R.id.pdfView); pdfView.setVisibility(WebView.VISIBLE); WebSettings webSettings = pdfView.getSettings(); webSettings.setJavaScriptEnabled(true); pdfView.loadUrl("https://docs.google.com/gview?embedded=true&url="+txt_file_path); } }
ทดสอบแอปพลิเคชันของเราหน่อยดีกว่า:
รันแอปพลิเคชันแล้วจะมีการโหลดประมาณนี้เมื่อมีการเปลี่ยนหน้า:
เรียบร้อยแล้ว !!! แอปพลิเคชัน Comic E-Book ของเราแบบง่ายๆ สำหรับอ่าน PDF ด้วย android และ Firebase