Lỗi không đọc được json dongabank từ websever android năm 2024
Bạn muốn xây dựng ứng dụng để gửi thông báo tới khoảng 1000 máy client có kết nối internet cùng một lúc mà không tốn phí thì có thể nghiên cứu cách sử dụng Google Cloud Message (GCM), trong bài tập này Tui sẽ hướng dẫn các bạn từng bước xây dựng ứng dụng sử dụng GCM. Trước tiên Tui vẽ lại quy trình sơ lược cách thức vận hành của GCM như hình dưới đây: – Bạn chú ý là số 1,2,3,4 Tui để cùng màu đỏ – Số 5,6 Tui để cùng màu xanh. – Trung tâm Tui để Google Developer vì nó là điều phối cho các bước. Quy trình hoạt động như sau (số thứ tự là bước): Bước 0: – Phải tạo một Project trên https://console.developers.google.com trước để có được Sender Id và Application Id – Xây dựng Server và WebService của ta với CSDL phù hợp để lưu trữ Registration Id. Bước 1: – Các thiết bị Mobile Android sẽ gửi Sender Id và Application Id lên GCM server để đăng ký (chú ý là Sender Id được cung cấp từ Google Developers). Bước 2: – Nếu đăng ký thành công thì GCM Server sẽ tạo ra một mã đăng ký gọi là Registration Id và gửi ngược về cho thiết bị Android. Bước 3: – Sau khi nhận được Registration Id mà GCM Server gửi về, mỗi thiết bị Android này sẽ gửi Registration Id lên Server thông qua Web Service (chú ý là Server này do ta xây dựng, tức nó là độc lập với GCM Server của Google). Bước 4: – Sau khi Server của ta nhận được Registration Id (mỗi Android device sẽ được cung cấp Id riêng, theo từng session do GCM Server tạo ra) sẽ tiến hành lưu vào CSDL (do ta xây dựng) để sử dụng cho các lần sau này (gửi tin nhắn hàng loạt). Bước 5: – Xây dựng ứng dụng trên Server để cho phép gửi Tin nhắn hàng loạt (có thể gửi tới 1000 Android device mà không tốn phí), ở bước này cũng phải lấy Sender Id và Application Id do bước 0 tạo ra. Định dạng gửi tin sẽ theo JSON format, có thể gửi cả dấu Tiếng Việt. – Tin nhắn ở bước này sẽ được gửi lên GCM Server. Bước 6: – Sau khi GCM Server nhận được tin nhắn theo định dạng JSON ở bước 5, nó sẽ tiến hành gửi tơi tất cả các máy trạm được đăng ký trong gói JSON này và gần như ngay lập tức các Client đều nhận được. Bài này rất hay và có thể áp dụng được thực tế để giúp giảm thiểu chi phí nhắn tin SMS, vì về sau nhân viên sử dụng Smart Phone rất nhiều và dường như WIFI có trong mọi ngóc nghách hẻm hóc….. nên có thể triển khai để nhắn tin cho nhân viên thông báo họp hay đi ăn nhậu…. Đối với Trường học cũng vậy có thể áp dụng để nhắn tin cho học sinh , sinh viên lên tới 1000 người mà không tốn phí (Vì theo Tui càng về sau giới trẻ sẽ ưa chuộng Smart Phone hơn là cục gạch Nồi Đồng Cối Đá được sản xuất từ kiếp trước). Bước 0, 5, 6 là xây dựng cho Server Side (CSDL, Webserver, WebService, Webform…) Bước 1,2,3,4 là xây dựng cho Client Side (Android Application). Chi tiết từng bước Tui sẽ hướng dẫn cụ thể để bạn có thể triển khai thực tế: —————————————————————————— Bây giờ bạn cần làm theo từng bước dưới đây nhé: Bước 0, 5,6: – Xây dựng Server Side – Phải tạo một Project trên https://console.developers.google.com trước để có được Sender Id và Application Id – Xây dựng Server và WebService của ta với CSDL phù hợp để lưu trữ Registration Id. Như vậy ở bước 0 bạn phải xử lý 2 công việc chính đó là tạo project trên developer của google + xây dựng Server, bước này khá vất vả. Ngoài ra Tui sẽ dựng Webservice và CSDL ở trên Server miễn phí http://www.somee.com mà trong bài 44 Tui đã đề cấp tới, nếu bạn chưa rõ có thể vào bài này để xem lại (vì Tui sẽ không hướng dẫn lại nữa, chỉ hiển thị kết quả do đó bạn nào chưa học thì phải xem lại bài 44 thì mới hiểu được). – Trước tiên cần phải tạo Project trên https://console.developers.google.com trước để có được Sender Id và Application Id. Sau khi bạn vào trang developer này và đăng nhập thì có giao diện như sau(dĩ nhiên google sẽ thay đổi nếu như có version mới): Ở đây Tui dùng email [email protected] để hướng dẫn. Mục 2: Nhập vào Project ID, nếu muốn nó tự tạo thì bạn nhấn mục số 3 Mục 3: Nhờ Google tạo ID Mục 4: Bấm vào Create để chấp nhận tạo Project, chú ý bạn phải checked vào “I have read and agree to all”. Sau khi bấm “Create“, bạn chờ giây lát google sẽ tạo project cho bạn như màn hình dưới đây: Project Number: 1009585144224 Đây chính là Sender ID, bạn cần nhớ chỗ này để copy + paste vào Client side (android) và Server side của bạn. Bạn nhớ đừng có dùng Sender ID này của Tui nhé, nếu có quá nhiều người sài, mỗi người gửi 1000 client…. Google nói Tui Spam họ…. họ ngắt tài khoản của Tui…. Tui sẽ buồn man mác đó….Không hướng dẫn thêm được. Nếu bạn bấm lung tung 1 hồi không tìm thấy Sender Id này thì nhớ bấm vào Overview để thấy lại nó nhé: Bạn vào APIs & auth/ chọn Credentials: API key chính là Application ID. Như vậy bạn đã có được Sender ID và Application ID. Bạn cũng chú ý đừng sử dụng của Tui nhé, cố gắng tự tạo theo các bước Tui hướng dẫn mà sử dụng. – Tiếp theo của bước 0, Ta cần xây dựng Webservice, CSDL trên Server. Ở đây Tui dùng http://somee.com để tải dịch vụ lên sử dụng. Bước này Tui sẽ hướng dẫn bạn 2 cách tạo Server để truyền tin tới client: Dùng Webservice và dùng Desktop Application để bạn có nhiều lựa chọn cũng như tăng thêm vốn kiến thức về vận hành GCM. – Mọi thứ bạn nên tạo tại máy của bạn trước, sau khi test OK mới đưa lên Server. Bây giờ bạn tạo cơ sở dữ liệu trong SQL Server với tên “dbDrThanhGCM“, với 2 bảng: Tên cột Kiểu loại Ghi chú NewsID varchar(50) Mã tin tức, khóa chính Title nvarchar(MAX) Tiêu đề tin tức IsDeleted int 1 là xác nhận sọt rác, 0 là còn sử dụng Bảng TinTuc mục đích để thêm danh sách tin tức tại máy Server, mỗi lần thêm Tin nó sẽ tự động thông báo cho toàn bộ máy Client: Bảng GCMRegistration: Tên cột Kiểu loại Ghi chú RegNo int No (tự động tăng), khóa chính RegID nvarchar(MAX) Mã Registration ID của thiết bị do GCM server gửi về DateCreate date Ngày tạo IsDeleted int 1 là xác nhận sọt rác, 0 là còn sử dụng Bảng GCMRegistration dùng để lưu trữ các Registration Id của các Thiết bị đăng ký thành công trên GCM Server. Ta cần tạo bảng này để lưu trữ lại toàn bộ Registration Id của các thiết bị để sử dụng cho việc thông báo hàng loạt ở các lần khác nhau. Thường các ID này mặc định được lưu trữ khoảng 4 tuần trên GCM Server. Chú ý bảng GCMRegistration bạn có thể bỏ cột RegNo, dùng RegID làm khóa chính luôn. Nhưng tại vì Tui sợ Google thay đổi cơ chế làm tăng chiều dài của RegID sẽ vượt qua ràng buộc khóa chính nên Tui dùng RegNo tự động tăng, và bạn cũng chỉ quan tâm tới RegID vì nó là duy nhất (không quan tâm RegNo). – Bạn tiến hành Tạo WebService để tương tác với 2 bảng dữ liệu như dưới đây (Tui tạo Solution để nó chứa luôn 2 Project: Webservice và Desktop Application): Tạo solution tên GCMSolution Bấm chuột phải vào GCMWebService/chọn Add/ Chọn Web Service (ASMX), xuất hiện màn hình sau cho phép nhập tên: Ta dùng LINQ để tương tác CSDL, bấm chuột phải vào GCMWebService/chọn Add/ chọn LINQ to SQL classes: Ta tiến hành viết lệnh cho lớp drthanhgcmservice: using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace GCMWebService
{
/// -Tiếp theo ta tạo 1 Webform để gửi thông báo tới các máy trạm bằng cách bấm chuột phải vào GCMWebService/chọn Add/ chọn Web Form: Bạn thiết kế giao diện cho DrThanhWebForm như hình dưới đây: btnGuiThongBao: Nút lệnh để bắt đầu thực hiện lệnh gửi tin txtKetQua: Ô hiển thị kết quả sau khi gửi thông báo. Tiến hành viết coding cho nút “Gửi Thông báo”, bạn double click vào nó để viết lệnh như dưới đây: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace GCMWebService { public partial class DrThanhWebForm : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnGuiThongBao_Click(object sender, EventArgs e) { try { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); //đây chính là API Key: (copy paste từ Google developer nhé) string applicationID = ""; //lấy danh sách Registration Id string[] arrRegid = db.GCMRegistrations.Where(c => c.IsDeleted == 0).Select(c => c.RegID).ToArray(); //đây chính là Sender ID: (copy paste từ Google developer nhé) string SENDER_ID = ""; //lấy nội dung thông báo string value = txtThongBao.Text; WebRequest tRequest; //thiết lập GCM send tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); tRequest.Method = "POST"; tRequest.UseDefaultCredentials = true; tRequest.PreAuthenticate = true; tRequest.Credentials = CredentialCache.DefaultNetworkCredentials; //định dạng JSON tRequest.ContentType = "application/json"; //tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8"; tRequest.Headers.Add(string.Format("Authorization: key={0}", applicationID)); tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); string RegArr = string.Empty; RegArr = string.Join("\",\"", arrRegid); //Post Data có định dạng JSON như sau: / { "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "223/3", "time": "14:13.2252" }, "registration_ids":["dh4dhdfh", "dfhjj8", "gjgj", "fdhfdjgfj", "đfjdfj25", "dhdfdj38"] } */ string postData = "{ \"registration_ids\": [ \"" + RegArr + "\" ],\"data\": {\"message\": \"" + value + "\",\"collapse_key\":\"" + value + "\"}}"; Console.WriteLine(postData); Byte[] byteArray = Encoding.UTF8.GetBytes(postData); tRequest.ContentLength = byteArray.Length; Stream dataStream = tRequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); WebResponse tResponse = tRequest.GetResponse(); dataStream = tResponse.GetResponseStream(); StreamReader tReader = new StreamReader(dataStream); String sResponseFromServer = tReader.ReadToEnd(); txtKetQua.Text = sResponseFromServer; //Lấy thông báo kết quả từ GCM server. tReader.Close(); dataStream.Close(); tResponse.Close(); Response.Write(@""); } catch(Exception ex) { //Response.Write(ex.ToString()); string msgError = ex.ToString(); Response.Write(@""); } } } } – Bây giờ ta cần đưa toàn bộ CSDL và Web application này lên server somee để sử dụng chung (khi ta cấu hình trên này thì bất kỳ nơi đâu ta cũng có thể tương tác miễn là có Internet, bạn chú ý là khi đưa lên server somee thì họ yêu cầu 1 tháng phải tối thiểu 5 lần tương tác nhé nếu không họ sẽ xóa tài khoản. – Các bước đưa lên somee.com Tui đã trình bày rất kỹ lưỡng trong các bài tập trước đó (Tui có đề cập ở trên) bạn phải tự xem lại và cấu hình để biết cách đưa lên, Tui chỉ hiển thị kết quả sau khi cấu hình xong (Chú ý nếu bạn không tự xem lại các bài trước thì hãy ngừng luôn tại đây đừng có đọc tiếp nữa vì sẽ vô ích do không hiểu, bạn không thể lấy cái không biết này để thực hiện cái không biết khác). Bạn chú ý sau khi cấu hình để đưa CSDL lên somee bạn cần đổi lại chuỗi kết nối trong web.config để cho giống với somee cung cấp trước khi đưa lên máy chủ Somee (Nếu bạn có riêng HOsting thì tự cấu hình, không cần dùng somee): – Test Kết quả: http://drthanhgcm.somee.com/DrThanhWebForm.aspx (link này để gửi thông báo đến hàng loạt client): http://drthanhgcm.somee.com/drthanhgcmservice.asmx (dùng để tương tác thông tin giữa Client và Server của ta: Lưu Registration ID từ GCM server về, quản lý tin tức cũng như Registration (thêm mới, hiển thị danh sách): Cơ sở dữ liệu: http://download855.mediafire.com/cwhped1w6dhg/cjc26c2bmia2276/dbDrThanhGCM.sql Source code : http://download1501.mediafire.com/5dm93jhg9h7g/56azkjufqybm6lz/GCMSolution.rar Chú ý Source code bạn cần sửa 2 file: – File DrThanhWebForm.aspx.cs: Copy + paste lại Application ID và Sender Id của bạn – File Web.config: Copy + paste lại chuỗi kết nối. Tui đã test chạy thành công hết rồi mới đưa lên đây nhé các bạn, chú ý sửa 2 file lại cho đúng. Chú ý là ở bước số 0 Tui sẽ quay lại sau để hướng dẫn cách viết Desktop application để tương tác sử dụng GCM Server nhé, tạm thời dùng Webform (vì Tui sợ nhiều quá các bạn sẽ rối). Bước 1, 2, 3, 4: – Xây dựng Client Side Bước này chính là xây dựng Android Application để: – Gửi thông tin đăng ký lên GCM Server để nhận Registration Id – Lưu Registration Id vào CSDL trên server (của ta xây dựng) – Nhận thông báo từ Server (GCM Server) Bạn tạo 1 Project mới với tên “DrThanhAndroidTestGCM“, Project này có 2 chức năng chính đó là: – Tự động lắng nghe thông báo từ Server gửi về (Push Notification – GCM ) – Đọc danh sách Tin tức từ Server thông qua WebService. Bạn chú ý là chương trình sẽ tự động nhận thông tin từ Server trong cả trường hợp Ứng dụng đã bị tắt. Giao diện vô cùng tầm thường như sau: XML layout như sau: Bạn cần tham chiếu tới thư viện KSOAP API để tương tác tới .Net Webservice đã tạo ở trên. Và tải thư viện GCM để tương tác GCM Server của Google rồi chép cả 2 thư viện KSOAP, GCM vào thư mục libs như hình Tui chụp dưới đây:
Bổ sung thêm ic_bell (
Cuối cùng cấu hình AndroidManifest như sau:
———————————————————– Giờ ta tiến hành coding cho từng class: Lớp GCMIntentService: package tranduythanh.com; import tranduythanh.com.R; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.util.Log; import com.google.android.gcm.GCMBaseIntentService; import com.google.android.gcm.GCMRegistrar; import static tranduythanh.com.ServerTask.; public class GCMIntentService extends GCMBaseIntentService{ private static final String TAG = "GCMIntentService"; public GCMIntentService() { super(SENDER_ID); } @Override protected void onRegistered(Context context, String registrationId) { Log.i(TAG, "Device registered: regId = " + registrationId); displayMessage(context, getString(R.string.gcm_registered)); ServerTask.register(context, registrationId); } @Override protected void onUnregistered(Context context, String registrationId) { Log.i(TAG, "hủy đăng ký unregistered"); displayMessage(context, getString(R.string.gcm_unregistered)); if (GCMRegistrar.isRegisteredOnServer(context)) { //Call bỏ đăng ký ở đây GCMRegistrar.setRegisteredOnServer(context, false); //ServerTask.post_unregister(context, registrationId); } else { Log.i(TAG, "Ignoring unregister callback"); } } @Override protected void onMessage(Context context, Intent intent) { Log.i(TAG, "Received message"); //String message = getString(R.string.gcm_message); String message = intent.getStringExtra("message"); displayMessage(context, message); // notifies user generateNotification(context, message); } @Override protected void onDeletedMessages(Context context, int total) { Log.i(TAG, "Received deleted messages notification"); String message = getString(R.string.gcm_deleted, total); displayMessage(context, message); // notifies user generateNotification(context, message); } @Override public void onError(Context context, String errorId) { Log.i(TAG, "Received error: " + errorId); displayMessage(context, getString(R.string.gcm_error, errorId)); } @Override protected boolean onRecoverableError(Context context, String errorId) { // log message Log.i(TAG, "Received recoverable error: " + errorId); displayMessage(context, getString(R.string.gcm_recoverable_error, errorId)); return super.onRecoverableError(context, errorId); } /*
Coding ServerTask: package tranduythanh.com; import java.util.Random; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.MarshalFloat; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import tranduythanh.com.R; import com.google.android.gcm.GCMRegistrar; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; public final class ServerTask { //Biến lưu namespace do bạn cấu hình trong Webservice public static final String NAMESPACE="http://tranduythanh.com/"; //Biến lưu WSDL của server URL public static final String SERVER_URL ="http://drthanhgcm.somee.com/drthanhgcmservice.asmx?WSDL"; //biến lưu Sender ID public static final String SENDER_ID = "1050525163328"; //biến lưu log lại khi có sự kiện sảy ra public static final String TAG = "DrthanhGCM_LOG"; /
Code lớp TinTucAsyncTask: package tranduythanh.com;
import java.util.ArrayList;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import static tranduythanh.com.ServerTask.*;
public class TinTucAsyncTask extends AsyncTask Coding lớp MainActivity: package tranduythanh.com;
import java.util.ArrayList;
import tranduythanh.com.R;
import com.google.android.gcm.GCMRegistrar;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import static tranduythanh.com.ServerTask.*;
public class MainActivity extends Activity {
Button btnDangKyGCM;
ListView lvTinTuc;
public ArrayList Bạn có thể tham khảo Source code đầy đủ ở đây: http://download1516.mediafire.com/38l17dust0og/b7u58q8rp5ukql9/DrThanhAndroidTestGCM.rar Chú ý bạn phải cấu hình cho đúng CSDL cũng như Webservice, APPI Key, Sender ID thì mới có thể chạy ứng dụng |