Hi Thanasis,

Thanks very much for that advice. When you say, "disable
notification", do you mean just NOT calling
Service.setInboundMessageNotification? I have tried this but the
result is still the same. All new messages immediately get marked as
READ by the phone, just after they arrive, even if I don't call
readMessages in that time. Once the gateway is connected at all, the
messages automatically get marked as READ. Is there any other way to
explicitly disable notifications?
I've already come up with a simple work-around for this issue which
works pretty well - example code below (I've seen other people mention
similar solutions on this forum):
- read all READ messages at program startup and add all of these to a
vector
- every 20 seconds, read ALL messages again and ignore all those that
are already in the Vector. Any extra ones are new/unread messages.
- do whatever you want with these new messages but also add them to
the vector so they are not treated as new on the next iteration.
The only problem with the above solution is that it's pretty
inefficient (getting ALL messages regularly from the phone). Seems to
work so far though.

Most of my testing so far has been done with an old Nokia 6230 which
works very well. Another problem I'm having is that when I tried to
use the same application (readMessages) on my Samsung Galaxy S2 (GT-
I9000), readMessages only seems to be able to access messages on the
SIM card, not on the phone's internal memory. I thought this could
easily be fixed by setting an option on the phone to save messages to
SIM by default but no such option exists (not surprising on such a
modern phone because SIM card storage is so limited!). There is an
option to save a message to SIM once it has already arrived but that's
no use to me.

Anyway, I'm starting to think it might be too big of a challenge to
write an SMS feature for my 'communication aid' (http://aacireland.ie/
Grapevine.html) that will be compatible with all potential users'
mobile phones. I think there are too many models and I will be
spending a lot of time trying to sort out bluetooth drivers and
awkward behaviours of specific phone models. For that reason, I'm
starting to think that I should use either a USB GSM modem (that I
provide to my user with the communication aid tablet PC) or an online
facility like Clickatell.

The disadvantage of the GSM modem is that it's an extra piece of
hardware to buy, along with a pay-as-you-go SIM card and credit from a
network provider. The disadvantage of an online SMS facility is that
you have to have an internet connection to use it, something which may
not always be available for mobile clients (i.e. Wifi). I think the
Clickatell route is still the better option though - if a user has a
smart phone, they can use it's mobile/3G data connection to access the
internet (or I can provide them with a unit that has 3G in the first
place!).

Any more advice on the best option for me to take Thanasis? I really
appreciate your input so far (and your great SMS Java library!!).

Thanks,
Brian

If anybody's interested, here's my code for the above example
(identifying NEW messages using a regular call to readMessages())..
Sorry, formatting came out a bit ugly!

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Vector;
import org.smslib.AGateway.Protocols;
import org.smslib.InboundMessage;
import org.smslib.InboundMessage.MessageClasses;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;

public class ReadMessages
{
    Vector Vmsg;

        public void doIt()
        {
                try
                {
                        // Create the Gateway representing the serial GSM modem.
                        SerialModemGateway gateway = new 
SerialModemGateway("modem.com1",
"COM15", 9600, "", "");
                        // Set the modem protocol to PDU (alternative is TEXT). 
PDU is the
default, anyway...
                        gateway.setProtocol(Protocols.PDU);
                        // Do we want the Gateway to be used for Inbound 
messages?
                        gateway.setInbound(true);
                        // Do we want the Gateway to be used for Outbound 
messages?
                        gateway.setOutbound(true);

                        Service.getInstance().addGateway(gateway);
                        Service.getInstance().startService();
                        // Printout some general information about the modem.
                        System.out.println("Modem Information:");
                        System.out.println("  Manufacturer: " + 
gateway.getManufacturer());
                        System.out.println("  Model: " + gateway.getModel());

            // Add all of the READ messages on the phone to the
Vector, Vmsg
            Vmsg = new Vector();
            InboundMessage initmsgs[] =
Service.getInstance().readMessages(MessageClasses.READ);
            for (int i = 0; i < initmsgs.length; i++)
            {
                Vmsg.add(getUniqueMessageString(initmsgs[i]));
                // Display a one-line summary of each message found
                System.out.println(" - "+initmsgs[i].getOriginator()
+" ("+initmsgs[i].getDate()+"): "+initmsgs[i].getText());
            }

                        while(true)
            {
                // Get ALL messages from the phone
                InboundMessage msg[] =
Service.getInstance().readMessages(MessageClasses.ALL);
                int countnew = 0;

                // Check each message to see if it's already in our
Vector, Vmsg
                for (int i = 0; i < msg.length; i++)
                {
                    // If the message is not in our Vector, it's a NEW
message
                    if(!Vmsg.contains(getUniqueMessageString(msg[i])))
                    {
                        // Add the new message to the Vector (so it's
not treated as new in the next iteration of this while loop)
                        Vmsg.add(getUniqueMessageString(msg[i]));
                        // Display the new message (on one line)
                        System.out.println(" - "+msg[i].getOriginator()
+" ("+msg[i].getDate()+"): "+msg[i].getText());
                        countnew++;
                    }
                }
                // Display the status after this check for new
messages
                System.out.println(getCurrentDateTimeString()+": Total
"+msg.length+" messages ("+countnew+" new)..");

                Thread.sleep(20000);
            }
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
                finally
                {
            try
            {
                Service.getInstance().stopService();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
                }
        }

    public String getUniqueMessageString(InboundMessage msg)
    {
        if(msg == null)
            return null;
        return msg.getDate().toString();
    }

    public String getCurrentDateTimeString()
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd
HH:mm:ss");
        Calendar cal = Calendar.getInstance();
        return dateFormat.format(cal.getTime());
    }

        public static void main(String args[])
        {
                ReadMessages app = new ReadMessages();
        app.doIt();
        }
}

On Jun 6, 9:46 pm, Thanasis Delenikas wrote:
> Hi,
>
> I am afraid this is not possible.
> The phone marks messages as READ by itself.
>
> You could disable the notifications (notifications are the ones which
> instruct SMSLib to read messages "behind your back", without
> you explicitly requesting the read), but you will get the same result
> (messages -> status READ) when you call readMessages() as well.
>
> Does this suit you?
>
> On Wed, Jun 6, 2012 at 1:58 PM, SMSLib Discussion Group on behalf of Brian
> O Carroll <[email address]> wrote:
>
>
>
>
>
>
>
> > Hi All,
>
> > I have some successful test applications working with SMSlib but
> > there's one thing that I can't get working properly. When my phone is
> > connected and the service is started, all messages that arrive on the
> > phone immediately get marked as 'read' on the phone (even if I don't
> > read them from SMSlib or from the phone).
>
> > Why is that? Is there some way I can stop SMSlib from doing that?
>
> > I am using a regular check of
> > Service.readMessages(MessageClasses.UNREAD) to see when new messages
> > arrive. The callback method is not suitable for me because I need to
> > leave the messages on the phone. I don't want to just delete all
> > messages from the phone when they are read.
>
> > Thanks,
> > Brian
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "SMSLib Discussion Group" group.
> > To post to this group, send email to [email address].
> > To unsubscribe from this group, send email to
> > [email address].
> > For more options, visit this group at
> >http://groups.google.com/group/smslib?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"SMSLib Discussion Group" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/smslib?hl=en.

  • [smslib] All messages... SMSLib Discussion Group on behalf of Brian O Carroll
    • Re: [smslib] All... SMSLib Discussion Group on behalf of T.Delenikas
      • [smslib] Re:... SMSLib Discussion Group on behalf of Brian O Carroll
        • [smslib]... SMSLib Discussion Group on behalf of T.Delenikas
          • [sms... SMSLib Discussion Group on behalf of Brian O Carroll
            • ... Achintha Rathnayaka via SMSLib Discussion Group
          • [sms... Achintha Rathnayaka via SMSLib Discussion Group
    • [smslib] Re: All... SMSLib Discussion Group on behalf of salena
    • [smslib] Re: All... Eduardo González via SMSLib Discussion Group

Reply via email to