1

Web サービス経由で SMS のグループを取得して送信する Android アプリケーションを開発しています。これはサービスとして実装されており、たとえば LogCat 経由で 2 分ごとに呼び出されます。しかし、電話では常に機能するとは限りません。サーバーから電話に到達すると確信していますが、明らかに sendTextMessage と sendMultipartTextMessage が機能していません。なし、ランダムに再生されます。私の問題はどこにあるかわかりますか?

サービス :

public class CopyOfSender extends Service {

    static final String KEY_ITEM_SMSList = "SMS";
    static final String KEY_Id = "Id";
    static final String KEY_Message = "Message";
    static final String KEY_Number = "Number";
    String SmsURL = "GetSMS/";
    String UpdateMessageStatuseURL = "UpdateSMSStatus";
    ConnectionDetector cd;
    String userNumner = "";
    String password = "";
    String smsPerSend = "20";
    Context thisContext = null;

    @Override
    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        thisContext = getApplicationContext();
        PowerManager pm = (PowerManager) getApplicationContext()
                .getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK, "");
        SharedPreferences pref = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        if (pref.getString("smsPerSend", null) != null) {
            smsPerSend = pref.getString("smsPerSend", "");
        }
        cd = new ConnectionDetector(getApplicationContext());
        String BaseUrl = getApplicationContext().getResources().getString(
                R.string.baseURl);
        SmsURL = BaseUrl + SmsURL;
        UpdateMessageStatuseURL = BaseUrl + UpdateMessageStatuseURL;
        wl.acquire();
        if (pref.getString("phonenumber", null) == null
                || pref.getString("password", null) == null) {

        } else {
            userNumner = pref.getString("phonenumber", "");
            password = pref.getString("password", "");
            if (!cd.isConnectingToInternet()) {
                Toast.makeText(getApplicationContext(),
                        getApplicationContext().getString(R.string.noInternet),
                        Toast.LENGTH_LONG).show();
            } else {
                new SendSMS().execute();
            }
        }
        wl.release();
    }

    private class Message {
        public String Id;
        public String Message;
        public String Number;
    }

    private class SendSMS extends AsyncTask<Object, Object, Object> {

        List<Message> messages = new ArrayList<Message>();

        @Override
        protected Object doInBackground(Object... arg0) {

            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(SmsURL + "?number=" + userNumner
                    + "&password=" + password + "&count=" + smsPerSend);
            Document doc = parser.getDomElement(xml);

            NodeList nl = doc.getElementsByTagName(KEY_ITEM_SMSList);
            for (int i = 0; i < nl.getLength(); i++) {
                Element e = (Element) nl.item(i);

                String tempId = parser.getValue(e, KEY_Id);
                String tempMessage = parser.getValue(e, KEY_Message);
                String tempNumber = parser.getValue(e, KEY_Number);
                Message tempSMS = new Message();
                tempSMS.Id = tempId;
                tempSMS.Message = tempMessage;
                tempSMS.Number = tempNumber;
                messages.add(tempSMS);
            }
            for (Message item : messages) {
                if (item.Number.trim().length() != 0) {
                    if (item.Message.trim().length() != 0) {
                        sendSMS(item.Number.trim(), item.Message.trim(),
                                Integer.parseInt(item.Id));
                    }
                }
            }
            return null;
        }

        protected void onPostExecute(Object result) {
            return;
        }
    }

    private class UpdateSMSStat extends AsyncTask<Object, Object, Object> {

        @Override
        protected Object doInBackground(Object... arg0) {

            int smsId = (Integer) arg0[0];
            int stat = (Integer) arg0[1];

            XMLParser parser = new XMLParser();
            List<NameValuePair> IdsToSend = new ArrayList<NameValuePair>();
            IdsToSend.add(new BasicNameValuePair("MessageIds", Integer
                    .toString(smsId)));
            IdsToSend.add(new BasicNameValuePair("Status", Integer
                    .toString(stat)));
            IdsToSend.add(new BasicNameValuePair("Number", userNumner));
            IdsToSend.add(new BasicNameValuePair("Password", password));
            parser.sendPostRequest(UpdateMessageStatuseURL, IdsToSend);

            return null;
        }

    }

    private void sendSMS(final String phoneNumber, String message,
            final int messageId) {
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent sentPI = PendingIntent.getBroadcast(thisContext, 0,
                new Intent(SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(thisContext, 0,
                new Intent(DELIVERED), 0);

        thisContext.registerReceiver(new BroadcastReceiver() {
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                case Activity.RESULT_OK:
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    break;
                }
            }
        }, new IntentFilter(SENT));

        thisContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                case Activity.RESULT_OK:
                    new UpdateSMSStat().execute(messageId, 1, phoneNumber);
                    break;
                case Activity.RESULT_CANCELED:
                    new UpdateSMSStat().execute(messageId, 3, phoneNumber);
                    break;
                }
            }
        }, new IntentFilter(DELIVERED));

        Pattern p = Pattern
                .compile("[^a-zA-Z0-9!@#$%^&*()_+-=\\|`~{};':,.<>/?/[/]\" ]");
        boolean hasSpecialChar = p.matcher(message).find();
        SmsManager sms = SmsManager.getDefault();

        if (hasSpecialChar) {
            if (message.length() > 70) {
                ArrayList<String> parts = sms.divideMessage(message);
                ArrayList<PendingIntent> sentPis = new ArrayList<PendingIntent>();
                ArrayList<PendingIntent> deliverPis = new ArrayList<PendingIntent>();
                sentPis.add(sentPI);
                deliverPis.add(deliveredPI);
                sms.sendMultipartTextMessage(phoneNumber, null, parts, sentPis,
                        deliverPis);
            } else {
                sms.sendTextMessage(phoneNumber, null, message.toString(),
                        sentPI, deliveredPI);
            }
        } else {
            if (message.length() > 160) {
                ArrayList<String> parts = sms.divideMessage(message);
                ArrayList<PendingIntent> sentPis = new ArrayList<PendingIntent>();
                ArrayList<PendingIntent> deliverPis = new ArrayList<PendingIntent>();
                sentPis.add(sentPI);
                deliverPis.add(deliveredPI);
                sms.sendMultipartTextMessage(phoneNumber, null, parts, sentPis,
                        deliverPis);
            } else {
                sms.sendTextMessage(phoneNumber, null, message.toString(),
                        sentPI, deliveredPI);

            }
        }
    }
}
4

3 に答える 3

0

openfire サーバーの xmpp プロトコルを使用する Chat アプリケーション (smack) で同じ問題が発生しました。そして私は解決しました。

SMS がサーバーとの接続を使用している場合。接続に問題があると思います。次のように、メッセージ送信時にバケットを作成する必要があります。

sendMessage(message)
{
   try
    { 
      // your message send code 
    }
    catch(Exception e)
    {
      // save your message in a local DB.
    }
}

したがって、接続がサーバーに再接続されると、次のようなすべてのバケットメッセージが送信されます

connection.connect();

// here check to bucket.
// if there is any message 
// send all message 
// and delete all bucket message.

// else if there is not any message in bucket.
 // then bucket is empty so no message need to send.

このロジックに従ってください。あなたのメッセージが失われることはありません。

また、エミュレータ接続では有線接続であるため、接続が常に失われることはなく、すべてのメッセージが送信されます。

また、実際の Android デバイスは、ネットワークの問題などによって接続が失われる可能性があります。主にWifiの場合。そしてサービス再開。

ありがとうございました!

于 2013-08-29T11:45:22.240 に答える