Hi, I am trying to send a push notification through server code, however it doesn’t seem to work correctly:
Server Code:
private String sendMessage(int type,String from,String recipient,String msg_content,byte[] img_bitmap,String geo_lat,String geo_long,String address,String cvs_name,String cvs_phone,byte[]cvs_bitmap) {
String whereClause = this.user_field + " = '" + recipient + "'";
BackendlessDataQuery query = new BackendlessDataQuery(whereClause);
BackendlessCollection<BackendlessUser> users = Backendless.Data.of(BackendlessUser.class).find(query);
String deviceToken = "";
if (users.getData().size() > 0) {
deviceToken = users.getData().get(0).getProperty("currentDeviceId").toString();
}
System.out.println("deviceid = "+deviceToken);
List<String> devices = new ArrayList<>();
devices.add(deviceToken);
DeliveryOptions deliveryOptions = new DeliveryOptions();
deliveryOptions.setPushSinglecast(devices);
PublishOptions publishOptions = new PublishOptions();
publishOptions.putHeader( "android-ticker-text", "New cartow message" );
publishOptions.putHeader( "android-content-title", "New cartow message" );
publishOptions.putHeader( "android-content-text", "test" );
publishOptions.putHeader("type", String.valueOf(type));
publishOptions.putHeader("from",from);
publishOptions.putHeader("time", String.valueOf(System.currentTimeMillis()));
switch (type){
case 0:
publishOptions.putHeader("msg_content", msg_content);
break;
case 1:
publishOptions.putHeader("img_bitmap", String.valueOf(img_bitmap));
break;
case 2:
publishOptions.putHeader("geo_lat",geo_lat );
publishOptions.putHeader("geo_long", geo_long);
publishOptions.putHeader("address", address);
break;
case 3:
publishOptions.putHeader("cvs_name", cvs_name);
publishOptions.putHeader("cvs_phone", cvs_phone);
publishOptions.putHeader("cvs_bitmap", String.valueOf(cvs_bitmap));
break;
}
MessageStatus status = Backendless.Messaging.publish("cartownmessage", publishOptions, deliveryOptions);
System.out.println("message sent");
return String.valueOf(status.getStatus());
}
Custom Reciever:
public class PushReceiver extends BackendlessBroadcastReceiver {
private long notification_id = 0;
private WiChatDB LocalDatabase;
@Override
public void onError(Context context, String message) {
super.onError(context, message);
Log.i("PushReciever","error: "+message);
}
@Override
public boolean onMessage(Context context, Intent intent) {
HashMap arguments = new HashMap();
int type = Integer.parseInt(intent.getStringExtra("type"));
String senderId = intent.getStringExtra("from");
String time = intent.getStringExtra("time");
arguments.put("type",type);
arguments.put("from",senderId);
arguments.put("time",time);
LocalDatabase = new WiChatDB(context, Utils.getUsername());
switch (type){
case 0:
String msg_content = intent.getStringExtra("msg_content");
notification_id = LocalDatabase.addMessage(3,senderId,time,false,false,msg_content);
arguments.put("msg_content",msg_content);
break;
case 1:
byte [] img = intent.getStringExtra("img_bitmap").getBytes();
notification_id = LocalDatabase.addImage(4,senderId,time,false,false,img);
break;
case 2:
String geo_lat = intent.getStringExtra("geo_lat");
String geo_long = intent.getStringExtra("geo_long");
String geo_address = intent.getStringExtra("address");
GeoPoint point = new GeoPoint();
point.setLatitude(Double.parseDouble(geo_lat));
point.setLongitude(Double.parseDouble(geo_long));
notification_id = LocalDatabase.addLocation(5,senderId,time,false,false,point,geo_address);
arguments.put("geo_address",geo_address);
break;
case 3:
String cvs_name = intent.getStringExtra("cvs_name");
String cvs_phone = intent.getStringExtra("cvs_phone");
byte[] cvs_bitmap = intent.getStringExtra("cvs_bitmap").getBytes();
notification_id = LocalDatabase.addContact(7,senderId,time,false,false,cvs_name,cvs_phone,cvs_bitmap);
arguments.put("cvs_name",cvs_name);
arguments.put("cvs_phone",cvs_phone);
break;
}
sendNotification(context,arguments);
return false;
}
private void sendNotification(Context ctx, HashMap args) {
if(new WiChatSharedPreferences(ctx).isSettings_allow_notifications()){
Intent intent = new Intent(ctx, MainActivity.class);
intent.putExtra("isNotification",true);
intent.putExtra("goToChat",true);
intent.putExtra("senderId",args.get("from").toString());
String title = ctx.getResources().getString(R.string.new_message);
String message = "";
WiChatSharedPreferences preferences = new WiChatSharedPreferences(ctx);
switch ((int) args.get("type")){
case 0:
if(preferences.isSettings_display_private_notifications())
message = ctx.getResources().getString(R.string.info_msg,args.get("from").toString(),args.get("msg_content").toString());
else message = ctx.getResources().getString(R.string.info_msg_private);
break;
case 1:
if(preferences.isSettings_display_private_notifications())
message = ctx.getResources().getString(R.string.info_img,args.get("from").toString());
else message = ctx.getResources().getString(R.string.info_msg_private);
break;
case 2:
if(preferences.isSettings_display_private_notifications())
message = ctx.getResources().getString(R.string.info_location,args.get("from").toString());
else message = ctx.getResources().getString(R.string.info_msg_private);
break;
case 3:
if(preferences.isSettings_display_private_notifications())
message = ctx.getResources().getString(R.string.info_contact,args.get("from").toString());
else message = ctx.getResources().getString(R.string.info_msg_private);
break;
}
//int notification_id=0;
//intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);
Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), R.mipmap.ic_launcher);
if(LocalDatabase.getChatListByUsername(args.get("from").toString()).getBitmap()!=null){
LocalDatabase.getChatListByUsername(args.get("from").toString()).getBitmap();
}
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(bm)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify((int) this.notification_id /* ID of notification */, notificationBuilder.build());
}
}
}
Manifest
<receiver android:name=".services.PushReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="net.crofis.wichat"/>
</intent-filter>
</receiver>