如何仅读取和显示从收件箱到 Android 应用程序的交易消息
Posted
技术标签:
【中文标题】如何仅读取和显示从收件箱到 Android 应用程序的交易消息【英文标题】:how to read and display only transaction messages from inbox to an android app 【发布时间】:2017-02-23 11:46:30 【问题描述】:我已经知道如何从收件箱中读取消息,但我想实现一个 android 应用程序来只读交易消息并在 列表视图中显示交易金额 strong> ,贷记借记等。对于我的完整代码。 current complete code for fetching sms data.如何根据需求过滤短信数据。
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;
【问题讨论】:
你试过我的答案了吗?? 您的问题得到答案了吗?如果是,你能分享答案吗? 【参考方案1】:对于一个快速的想法,我想建议你几个方法:
首先,从收件箱中对任何交易类型的消息进行排序将非常具有挑战性,您所能做的就是浏览每条消息并阅读正文并找出您所需的消息列表,但这也不可行。
例如,您必须访问地址字段并执行必要的操作,因为短信拥有所有字段,例如:地址、正文、接收日期等。
正如您提到的,您知道如何阅读收件箱中的消息,我将跳过该部分。附上一些可能对您有帮助的链接 ref this library,one more
【讨论】:
提供的参考是过时和未维护的项目【参考方案2】:基本上跨国邮件地址包含一些模式。例如。
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
之类的词,您可以访问它。
【讨论】:
你能告诉我如何在这个示例中使用你的代码...pastebin.com/YYxktV7D 这是接收者,它将从收件箱中获取您的跨国邮件 好吧,让我试试。我是这个领域的新手,所以需要一些帮助。 请查看有问题的代码的更新部分。当我试图放置你的代码的逻辑时,它会给出空指针异常,因为它使用游标类来获取数据和你的代码使用intents.can你解决这个问题。 @Piyush 这个正则表达式不仅获取交易短信,还获取其他不是来自银行的消息(不是私人短信)。【参考方案3】:用它来阅读交易信息:
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
【讨论】:
这不起作用,什么是垃圾邮件、促销、内容消息、消息。您可以添加该信息吗? 垃圾邮件、促销邮件是按文件夹排列的邮件。【参考方案4】:每条事务性消息都具有以下特征:
-
发件人的格式始终为 XX-XXXX
邮件中将包含 a/c, account no:。
会有avbl bal、available balance、balance、combined balance、avl bal等关键字。
会有交易关键字,如借方、贷方、付款。
如果你能结合所有这些条件,那么你会发现一个事务性消息。
这是一个可能有用的库https://github.com/minimal-scouser/trny
【讨论】:
以上是关于如何仅读取和显示从收件箱到 Android 应用程序的交易消息的主要内容,如果未能解决你的问题,请参考以下文章
Android 从收件箱获取短信,优化的方式来阅读所有消息并将它们分组
添加用户电子邮件以使用 Gmail API 从收件箱中读取特定电子邮件