как читать и отображать только сообщения о транзакциях из папки «Входящие» в приложение для Android

Я уже знаю, как читать сообщения из папки «Входящие», но я хочу реализовать приложение для Android для сообщения о транзакции только для чтения и отображать его в представлении списка с суммой транзакции, кредит дебет и т.д.Для моего полного кода. текущий полный код для получения данных смс.как фильтровать данные смс в соответствии с требованиями.

public List<SmsInfo> getSmsInfo() {
        String[] projection = new String[] { "_id", "address", "person",
                "body", "date", "type" };

//      @SuppressWarnings("deprecation")
//      Cursor cursor = activity.managedQuery(uri, projection, null, null,
//              "date desc");

        ContentResolver cr = activity.getContentResolver();
        Cursor cursor = cr.query(uri, projection, null, null, "date desc");

        int nameColumn = cursor.getColumnIndex("person");
        int phoneNumberColumn = cursor.getColumnIndex("address");
        int smsbodyColumn = cursor.getColumnIndex("body");
        int dateColumn = cursor.getColumnIndex("date");
        int typeColumn = cursor.getColumnIndex("type");
        if (cursor != null) {
            int i = 0;
            while (cursor.moveToNext() && i++ < 20) {
                SmsInfo smsInfo = new SmsInfo();
                smsInfo.setName(cursor.getString(nameColumn));
                smsInfo.setDate(dateFromLongToString(cursor.getString(dateColumn)));
                smsInfo.setPhoneNumber(cursor.getString(phoneNumberColumn));
                smsInfo.setSmsbody(cursor.getString(smsbodyColumn));
                smsInfo.setType(cursor.getString(typeColumn));
                String personName = getPeople2(smsInfo.getPhoneNumber());
                smsInfo.setName(null == personName ? smsInfo.getPhoneNumber()
                        : personName);
                infos.add(smsInfo);
            }
            cursor.close();
        }
        return infos;
    }

person Adi    schedule 14.10.2016    source источник
comment
ты пробовал мой ответ??   -  person Piyush    schedule 14.10.2016
comment
Вы получили ответ на свой вопрос? Если да, можете ли вы поделиться ответом?   -  person K Pradeep Kumar Reddy    schedule 21.06.2020


Ответы (4)


В основном транснациональные адреса сообщений содержат некий шаблон. Например.

AM-HDFCBK

Итак, увидев это, я сделал регулярное выражение для получения сообщений, связанных с этим шаблоном.

Pattern regEx = Pattern.compile("[a-zA-Z0-9]{2}-[a-zA-Z0-9]{6}");

protected BroadcastReceiver myReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        final Bundle bundle = intent.getExtras();
        try {
            if (bundle != null) {
                final Object[] pdusObj = (Object[]) bundle.get("pdus");
                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage;
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        String format = bundle.getString("format");
                        currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i], format);
                        Log.e("Current Message", format + " : " + currentMessage.getDisplayOriginatingAddress());
                    } else {
                        currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    }
                    Pattern regEx =
                            Pattern.compile("[a-zA-Z0-9]{2}-[a-zA-Z0-9]{6}");
                    Matcher m = regEx.matcher(currentMessage.getDisplayOriginatingAddress());
                    if (m.find()) {
                        try {
                            String phoneNumber = m.group(0);
                            Long date = currentMessage.getTimestampMillis();
                            String message = currentMessage.getDisplayMessageBody();
                            Log.e("SmsReceiver Mine", "senderNum: " + phoneNumber + "; message: " + message);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        Log.e("Mismatch", "Mismatch value");
                    }
                }
            }
        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" + e);
        }

    }
};

Итак, после этого вы можете проверить, содержит ли тело сообщения такое слово, как credited , debited, вы можете получить к нему доступ.

person Piyush    schedule 14.10.2016
comment
Пожалуйста, скажите мне, как использовать ваш код с этим образцом... pastebin.com/YYxktV7D - person Adi; 15.10.2016
comment
Это получатель, который будет получать ваши транснациональные сообщения из почтового ящика. - person Piyush; 17.10.2016
comment
Хорошо, позвольте мне попробовать .. Я новичок в этой области, поэтому мне нужна помощь. - person Adi; 17.10.2016
comment
Пожалуйста, посмотрите обновленную часть рассматриваемого кода. Когда я пытаюсь поместить логику вашего кода, он дает исключение нулевого указателя, потому что он использует класс курсора для выборки данных и вашего кода с использованием намерений. Можете ли вы решить эту проблему. @Пиюш - person Adi; 18.10.2016

Для быстрой идеи я хотел бы предложить вам несколько подходов:

Во-первых, будет довольно сложно отсортировать сообщения любого типа транзакций из папки «Входящие», все, что вы можете сделать, это либо просмотреть каждое сообщение, либо прочитать тело, либо узнать список необходимых сообщений, но это тоже невозможно.

Например, вам нужно получить доступ к полю адреса и сделать все необходимое, поскольку смс содержит все поля, такие как: адрес, тело, дата получения и многое другое.

Также, как вы упомянули, вы знаете, как читать сообщения из папки «Входящие», я пропускаю эту часть. Прикрепляю несколько ссылок, которые могут помочь вам ссылаться на эту библиотеку ,еще один

person Anurag    schedule 14.10.2016
comment
Приведенные ссылки относятся к устаревшим и неподдерживаемым проектам. - person Vivek; 21.05.2021

используйте это для чтения сообщений о транзакциях:

private void readMessages(){
    final int textViewID = searchView.getContext().getResources().
            getIdentifier("android:id/search_src_text", null, null);
    final AutoCompleteTextView searchTextView = (AutoCompleteTextView)
            searchView.findViewById(textViewID);
    try {
        Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
        mCursorDrawableRes.setAccessible(true);
        mCursorDrawableRes.set(searchTextView, 0); //This sets the cursor resource ID to 0 or @null which will make it visible on white background
    } catch (Exception e) {}


    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String dateVal = "";
    Cursor cursor = this.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
    if (cursor.moveToFirst()) { // must check the result to prevent exception
        do {
            String msgData = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
            String date = cursor.getString(cursor.getColumnIndexOrThrow("date")).toString();
            Long dateV = Long.parseLong(date);
            int start = 0;
            int end = 0;
            String msg = "";
            String add = cursor.getString(2);
            dateVal = formatter.format(new Date(dateV));

            if(!(spam.contains(add) || promo.contains(add))) {
                if(msgData.contains("credited")|| msgData.contains("debited") || msgData.contains("withdrawn")) {
                    messages.add(dateVal + ":" + msgData + "axqw" + add);
                    contentMessage.add(msgData);
                }
            }

        } while (cursor.moveToNext());
    } else {
        // empty box, no SMS
    }
}
person AshuKingSharma    schedule 08.05.2017
comment
Это не работает, что такое спам, реклама, содержание сообщения, сообщения. Можете ли вы добавить эту информацию? - person Archit Puri; 26.07.2020
comment
spam, promo — расположение сообщений по папкам. - person AshuKingSharma; 28.07.2020

Каждое транзакционное сообщение имеет следующие характеристики:

  1. Отправитель всегда имеет формат XX-XXXX
  2. Сообщение будет иметь a/c, номер счета: в нем.
  3. Там будут такие ключевые слова, как avbl bal, доступный баланс, баланс, комбинированный баланс, avl bal.
  4. Будут транзакционные ключевые слова, такие как дебет, кредит, оплата.

Если вы сможете соединить все эти условия, то вы найдете транзакционное сообщение.

Вот библиотека, которая может быть полезна https://github.com/minimal-scouser/trny

person Minimal Scouser    schedule 20.03.2021