Как восстановить длинное SMS (текстовое) сообщение из нескольких коротких текстовых сообщений, хранящихся в базе данных Android?

У меня есть ContentObserver прослушивание content://sms/inbox, Когда я отправляю длинное SMS-сообщение с одного эмулятора Android на другой эмулятор Android, это ContentObserver умножает количество срабатываний (в зависимости от количества коротких смс-сообщений в длинном смс-сообщении). Мне нужно объединить короткие сообщения в одно длинное сообщение, но у меня нет возможности решить, были ли эти сообщения отправлены как части одного длинного сообщения или они являются независимыми последовательными короткими сообщениями. Кажется доступным cursor столбцы вообще не содержат такой функции:

0 = "_id"
1 = "thread_id"
2 = "address"
3 = "person"
4 = "date"
5 = "date_sent"
6 = "protocol"
7 = "read"
8 = "status"
9 = "type"
10 = "reply_path_present"
11 = "subject"
12 = "body"
13 = "service_center"
14 = "locked"
15 = "sub_id"
16 = "error_code"
17 = "creator"
18 = "seen"

Как я знаю, есть способ сделать желаемое объединение через receiver а также "pdus", Это единственный способ продолжить?

PS Я обнаружил, что настоящий (не эмулятор) Android-клиент Android не хранит длинные сообщения в виде серии коротких сообщений. Объединяет короткие сообщения в storeMessage метод и сохраняет их как целое длинное сообщение в базе данных. Поэтому вопрос в том, почему эмулятор Android SMS-клиента отличается от реального!

ОБНОВИТЬ: SmsObserverучебный класс:

public class SMSObserver1 extends ContentObserver {
    private Context context;
    private SmsListener listener;

    public SMSObserver(Context context, Handler handler, SmsListener listener) {
        super(handler);
        this.context = context;
        this.listener = listener;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Uri mUri = Uri.parse("content://sms");
        Cursor mCursor = context.getContentResolver().query(mUri, null, null, null, null);
        if (mCursor != null && mCursor.moveToNext()) {
            SmsEntity entity = null;
            int type = mCursor.getInt(mCursor.getColumnIndex("type"));//now we need to decide SMS message is sent or received
            if (type == 1) //it's received SMS
                entity = getSMS(true);
            else if (type == 2) //it's sent SMS
                entity = getSMS(false);
            mCursor.close();
            if (entity != null)
                listener.addSms(entity);
        }
    }

    private SmsEntity getSMS(boolean isIncoming) {
        SmsEntity entity = null;
        Uri uri = Uri.parse(isIncoming ? "content://sms/inbox" : "content://sms/sent");
        Cursor cursor = context.getContentResolver().query(uri, null,null, null, null);
        if (cursor != null && cursor.moveToNext()) {
            entity = printSms(cursor, isIncoming);
            cursor.close();
        }
        return entity;
    }

    private SmsEntity printSms(Cursor cursor, boolean isIncoming){
        int type = cursor.getInt(cursor.getColumnIndex("type"));
        long msg_id= cursor.getLong(cursor.getColumnIndex("_id"));
        String phone = cursor.getString(cursor.getColumnIndex("address"));
        long dateVal = cursor.getLong(cursor.getColumnIndex("date"));
        String body = cursor.getString(cursor.getColumnIndex("body"));
        Date date = new Date(dateVal);

        String str = (isIncoming ? "Received" : "Sent") + " SMS: \n phone is: " + phone;
        str +="\n SMS type is: " + type;
        str +="\n SMS time stamp is:" + date;
        str +="\n SMS body is: " + body;
        str +="\n id is : " + msg_id;
        Log.v("Debug", str);

        return new SmsEntity(msg_id, dateVal, true, isIncoming, phone, body);
    }
}

Регистрация / отмена регистрации происходит в onResume/onPause обратные вызовы Fragment:

@Override
public void onPause() {
    super.onPause();
    unregisterContentObserver();
}

public void unregisterContentObserver() {
    if (mSmsObserver != null) {
        try {
            getActivity().getContentResolver().unregisterContentObserver(mSmsObserver);
        } catch (IllegalStateException ise) {
            Timber.w(ise.getMessage());
        } finally {
            mSmsObserver = null;
        }
    }
}

@Override
public void onResume() {
    super.onResume();
    registerContentObserver();
}

private void registerContentObserver() {
    mSmsObserver = new SMSObserver(getActivity(), new Handler(),this);
    getActivity().getContentResolver().registerContentObserver(Uri.parse("content://sms/inbox"), true, mSmsObserver);//To track an incoming SMS only
}

0 ответов

Другие вопросы по тегам