1

我已经知道如何从收件箱中读取消息,但我想实现一个 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;
    }
4

4 回答 4

1

基本上跨国邮件地址包含一些模式。例如。

AM-HDFCBK

所以看到这一点,我制作了正则表达式来获取与模式相关的消息。

模式正则表达式 = 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您可以访问的单词。

于 2016-10-14T07:15:50.237 回答
0

对于一个快速的想法,我想建议你几个方法:

首先,从收件箱中对任何交易类型的消息进行排序将非常具有挑战性,您所能做的就是浏览每条消息并阅读正文并找出所需的消息列表,但这也是不可行的。

例如,您必须访问地址字段并执行必要的操作,因为短信拥有所有字段,例如:地址、正文、接收日期等。

另外,正如您提到的,您知道如何从收件箱中阅读邮件,我将跳过该部分。附上一些可能有助于您 参考这个库的链接,还有一个

于 2016-10-14T06:54:19.223 回答
0

使用它来阅读交易信息:

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
    }
}
于 2017-05-08T08:43:10.123 回答
0

每条事务性消息都具有以下特征:

  1. 发件人的格式始终为 XX-XXXX
  2. 该消息将包含 a/c, account no: 在其中。
  3. 会有avbl bal、available balance、balance、combined balance、avl bal等关键字。
  4. 会有交易关键字,如借方、贷方、付款。

如果您可以结合所有这些条件,那么您将找到一个事务性消息。

这是一个可能有用的库https://github.com/minimal-scouser/trny

于 2021-03-20T13:06:39.183 回答