【问题标题】:How can I retrieve SMS messages from a telephone operator?如何从电话运营商处检索 SMS 消息?
【发布时间】:2016-04-13 22:38:36
【问题描述】:

我可以使用 TelephonyManager 获取用户的电话接线员,并且我需要使用此名称来检索从接线员处收到的文本。如何在 Android 的 ContextResolver.query() 方法中使用 SQL where 子句之类的东西?这是我检索用户收到的所有短信的代码。我需要调整它以从用户的电话接线员那里检索消息。

public void fetchSMS() {

    TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    String operator=tMgr.getNetworkOperatorName();
    Uri mSmsinboxQueryUri = Uri.parse("content://sms/inbox");
    String[] cols = new String[]{"_id", "thread_id", "address", "person", "date", "body", "type"};
    Cursor cursor1 = getContentResolver().query(
            mSmsinboxQueryUri,
            cols, null, null, null);
    if (cursor1!=null && cursor1.moveToFirst()) {
        do {
            String address = cursor1.getString(cursor1
                    .getColumnIndex(cols[2]));
            //String address2=(address.split("-"))[1];

                String date = cursor1.getString(cursor1
                        .getColumnIndex(cols[4]));
                String msg = cursor1.getString(cursor1
                        .getColumnIndex(cols[5]));
                String type = cursor1.getString(cursor1
                        .getColumnIndex(cols[6]));

                smsLog.append("\n" + "Address:").append(address).append("\n" + "Date:").append(date).append("\n" + "Message:").append(msg).append("\n" + "Type:").append(type).append("\n\n");
            cursor1.moveToNext();
        }
        while (!cursor1.isAfterLast());
        cursor1.close();
    }
}

【问题讨论】:

  • 除非您知道任何给定运营商可以从其发送 SMS 的每个地址,否则您将无法做到这一点 - 无论如何是可靠的。 SMS 表中没有包含运营商名称的列,并且无法保证来自运营商的消息将在消息正文中包含其名称。
  • 当发件人在充值后收到他/她的电信运营商的消息(预付费电话)时,他们会收到来自特定地址的短信(我的电话运营商叫Docomo,我收到的消息有发件人为 TA-Docomo)。其他运营商也一样。我只需要知道如何在 query() 方法中添加 where 子句。
  • 嗯,不能保证每个人都这样,但如果您只想要一个简单的 where 子句,您的查询将类似于:query(mSmsinboxQueryUri, cols, "address LIKE '%" + operator + "%'", null, null)
  • 非常感谢!这很有帮助! :)

标签: android


【解决方案1】:

可能对您有用。

More Information refer this page.

SmsBroadcastReceiver.java

这是一个广播接收器,用于接收经过意图过滤的 SMS 消息。在接收时,我们提取 SMS 消息包并显示 toast 消息,并通过将 SMS 消息添加到 SMS 收件箱列表来更新 UI。当 SMS 消息到达时,收件箱会自动刷新。

public class SmsBroadcastReceiver extends BroadcastReceiver {

    public static final String SMS_BUNDLE = "pdus";

    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";
            for (int i = 0; i < sms.length; ++i) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                String smsBody = smsMessage.getMessageBody().toString();
                String address = smsMessage.getOriginatingAddress();

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();

            //this will update the UI with message
            SmsActivity inst = SmsActivity.instance();
            inst.updateList(smsMessageStr);
        }
    }
}

SmsActivity.java 这是 SMS 应用程序的主要 Android 活动。它充当 SMS 收件箱。它有一个 ListView 来显示 SMS 消息。 onCreate 我们从其 Uri 读取内部 SMS 收件箱中存在的所有消息,并使用 ListView 显示它们。

public class SmsActivity extends Activity implements OnItemClickListener {

    private static SmsActivity inst;
    ArrayList<String> smsMessagesList = new ArrayList<String>();
    ListView smsListView;
    ArrayAdapter arrayAdapter;

    public static SmsActivity instance() {
        return inst;
    }

    @Override
    public void onStart() {
        super.onStart();
        inst = this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        smsListView = (ListView) findViewById(R.id.SMSList);
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
        smsListView.setAdapter(arrayAdapter);
        smsListView.setOnItemClickListener(this);

        refreshSmsInbox();
    }

    public void refreshSmsInbox() {
        ContentResolver contentResolver = getContentResolver();
        Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
        int indexBody = smsInboxCursor.getColumnIndex("body");
        int indexAddress = smsInboxCursor.getColumnIndex("address");
        if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
        arrayAdapter.clear();
        do {
            String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
                    "\n" + smsInboxCursor.getString(indexBody) + "\n";
            arrayAdapter.add(str);
        } while (smsInboxCursor.moveToNext());
    }

    public void updateList(final String smsMessage) {
        arrayAdapter.insert(smsMessage, 0);
        arrayAdapter.notifyDataSetChanged();
    }

    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
        try {
            String[] smsMessages = smsMessagesList.get(pos).split("\n");
            String address = smsMessages[0];
            String smsMessage = "";
            for (int i = 1; i < smsMessages.length; ++i) {
                smsMessage += smsMessages[i];
            }

            String smsMessageStr = address + "\n";
            smsMessageStr += smsMessage;
            Toast.makeText(this, smsMessageStr, Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

  • 不,这不是我想要的,但仍然值得了解。谢谢!
  • 如果我的回答能给你解决方案。放弃投票并接受我的回答。谢谢。@SubravetiSuraj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2017-04-03
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多