Can anyone help me to get a response as a JSON array from GCM?
Here is the incorrect response I am getting. Can anyone help me with it?
I am creating a cab booking app. I want to collect all driver data including locations and push it through GCM so I can get real-time locations of every driver.
Here is my error.
E/response: [{"id":"suraj854","0":"Suraj","1":"1234567890","2":"42.6640983","3":"56.9954983"}]
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: org.json.JSONException: Value [{"id":"suraj854","0":"Suraj","1":"1234567890","2":"42.6640983","3":"56.9954983"}] of type org.json.JSONArray cannot be converted to JSONObject
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at org.json.JSON.typeMismatch(JSON.java:111)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at org.json.JSONObject.<init>(JSONObject.java:160)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at org.json.JSONObject.<init>(JSONObject.java:173)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at elegantswebapps.cabdriver.services.GCMPushReceiverService$override.onMessageReceived(GCMPushReceiverService.java:68)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at elegantswebapps.cabdriver.services.GCMPushReceiverService$override.access$dispatch(GCMPushReceiverService.java)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at elegantswebapps.cabdriver.services.GCMPushReceiverService.onMessageReceived(GCMPushReceiverService.java:0)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at com.google.android.gms.gcm.GcmListenerService.zzq(Unknown Source)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at com.google.android.gms.gcm.GcmListenerService.zzp(Unknown Source)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at com.google.android.gms.gcm.GcmListenerService.zzo(Unknown Source)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at com.google.android.gms.gcm.GcmListenerService.zza(Unknown Source)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at com.google.android.gms.gcm.GcmListenerService$1.run(Unknown Source)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-03 16:18:17.228 8262-8325/elegantswebapps.cabdriver W/System.err: at java.lang.Thread.run(Thread.java:818)
Here is my code:
public function fetchall_user_online_drivers_() {
$smt = $this->conn->prepare("select * from driver where active_status=1");
$smt->execute();
$userdata = array();
$registration_ids = array();
while ($users = $smt->fetch()) {
//array_push($userdata,$users["username"],$users["first_name"],$users["longitude_current"],$users["latitude_current"]);
array_push($registration_ids, $users['gcm_id_token']);
array_push($userdata,array('id'=>$users["username"],$users["first_name"],$users["phone"],$users["longitude_current"],$users["latitude_current"]));
}
$data = array("message" => json_encode($userdata));
$this->realTimeAllDriverLocations($registration_ids, $data);
}
public function realTimeAllDriverLocations($gcm_id, $userdata) {
//Creating a new array fileds and adding the msg array and registration token array here
$fields = array(
'registration_ids' => $gcm_id,
'data' => $userdata
);
//Adding the api key in one more array header
$headers = array(
'Authorization: key= AIzaSyAlVrqgGDDZVM1G9_qoyEl1OinRFto8WhY',
'Content-Type: application/json'
);
//Using curl to perform http request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
//Getting the result
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
//Decoding json from result
$res = json_decode($result);
//Getting value from success
$flag = $res->success;
//if success is 1 means message is sent \
}
And this is how I am parsing the JSON array:
//This method will be called on every new message received
@Override
public void onMessageReceived(String from, Bundle bundle) {
//Getting the message from the bundle
if (!bundle.isEmpty()) {
data = bundle;
String message = bundle.getString("message");
try {
Log.e("response", bundle.getString("message"));
JSONObject jobj = new JSONObject(message);
Object obj = jobj.get("");
if (obj instanceof JSONArray) {
final JSONArray jarr = (JSONArray) obj;
if (jarr.length() > 0) {
for (int i = 0; i < jarr.length(); i++) {
JSONObject jsonObject = jarr.getJSONObject(i);
All_UserMapDetail person = new All_UserMapDetail();
if (!jsonObject.isNull("username")) {
person.setName(jsonObject.getString("username"));
}
if (!jsonObject.isNull("title")) {
person.setPhone(jsonObject.getString("title"));
Log.e("hgcghcghc",person.getName() );
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
sendNotification(data.getString(FIRST_NAME_DRIVER_KEY));
}
From your logcat response is [{"id":"suraj854","0":"Suraj","1":"1234567890","2":"42.6640983","3":"56.9954983"}] Your format is wrong, update your php script. update this line from php script array_push($userdata,array('id'=>$users["username"],$users["first_name"],$users["phone"],$users["longitude_current"],$users["latitude_current"]));
to array_push($userdata,array('username'=>$users["username"],'firstname'=>$users["first_name"],'phone'=>$users["phone"],'longitude_current'=>$users["longitude_current"],'latitude_current'=>$users["latitude_current"]));
change your keys according your requirement. Update in below json parsing.
update your parsing code as follows :
JSONArray jarr = new JSONArray(message);
if (jaar != null && jarr.length() > 0) {
for (int i = 0; i < jarr.length(); i++) {
JSONObject jsonObject = jarr.getJSONObject(i);
All_UserMapDetail person = new All_UserMapDetail();
if (!jsonObject.isNull("username")) {
person.setName(jsonObject.getString("username"));
}
if (!jsonObject.isNull("title")) {
person.setPhone(jsonObject.getString("title"));
Log.e("hgcghcghc",person.getName() );
}
}
First
You are a JSONArray but you try to parse by JSONObject.
Change the line JSONObject jobj = new JSONObject(message);
by this
JSONObject jobj = new JSONArray(message).getJSONObject(POSITION);
Second
Change you server side code to get proper response . You are calling key username
, title
which is not are not in your response .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.