android– 如何在收到短信时获取联系人姓名

android– 如何在收到短信时获取联系人姓名,第1张

概述我有以下代码来接收短信,我正在尝试获取联系人姓名.packagecom.example.smsTest;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.database.Cursor;importandroid.net.Uri;importandroid.os.B

我有以下代码来接收短信,我正在尝试获取联系人姓名.

package com.example.smsTest;import androID.content.broadcastReceiver;import androID.content.Context;import androID.content.Intent;import androID.database.Cursor;import androID.net.Uri;import androID.os.Bundle;import androID.provIDer.ContactsContract;import androID.provIDer.ContactsContract.PhoneLookup;import androID.telephony.SmsMessage;import androID.Widget.Toast;public class SmsReceiver extends broadcastReceiver {    private sqliteAdapter MysqLiteAdapter;    @OverrIDe    public voID onReceive(Context context, Intent intent) {        MysqLiteAdapter = new sqliteAdapter(context);        MysqLiteAdapter.openToRead();        Message message = null;        Bundle extras = intent.getExtras();        if (extras == null)            return;        Object[] pdus = (Object[]) extras.get("pdus");        for (int i = 0; i < pdus.length; i++) {            SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);            String sender = SMessage.getoriginatingAddress();            String body = SMessage.getMessageBody().toString();            message = MysqLiteAdapter.createMessage(sender, body);            // A custom Intent that will used as another broadcast            Intent in = new Intent("SmsMessage.intent.MAIN").putExtra(                    "get_msg", sender + ":" + body);            // To display a Toast whenever there is an SMS.            Toast.makeText(context, body, Toast.LENGTH_LONG).show();            Uri personUri = Uri.withAppendedpath( ContactsContract.PhoneLookup.CONTENT_FILTER_URI, SMessage.getoriginatingAddress());              Cursor cur = context.getContentResolver().query(personUri, new String[] { PhoneLookup.disPLAY_name }, null, null, null );              if( cur.movetoFirst() ) {                           int nameIndex = cur.getColumnIndex(PhoneLookup.disPLAY_name);                           String Personname = cur.getString(nameIndex);                          Toast.makeText(context, Personname, Toast.LENGTH_LONG).show();            }            cur.close();            // You can place your check conditions here(on the SMS or the            // sender)            // and then send another broadcast            context.sendbroadcast(in);            // This is used to abort the broadcast and can be used to silently            // process incoming message and prevent it from further being            // broadcasted. AvoID this, as this is not the way to program an            // app.            this.abortbroadcast();        }    }}

这是我添加的代码导致我的应用崩溃:

Uri personUri = Uri.withAppendedpath( ContactsContract.PhoneLookup.CONTENT_FILTER_URI, SMessage.getoriginatingAddress());  Cursor cur = context.getContentResolver().query(personUri, new String[] { PhoneLookup.disPLAY_name }, null, null, null );  if( cur.movetoFirst() ) {               int nameIndex = cur.getColumnIndex(PhoneLookup.disPLAY_name);               String Personname = cur.getString(nameIndex);              Toast.makeText(context, Personname, Toast.LENGTH_LONG).show();}cur.close();

我刚修改了link的答案中的代码.

现在,应用程序在收到短信时崩溃了.

解决方法:

试试这个代码

在广播接收器中

 public class SMSReceiver  extends broadcastReceiver{ String str = "";     String no = "";@OverrIDepublic voID onReceive(Context context, Intent intent) {    // Todo auto-generated method stub     Bundle bundle = intent.getExtras();          SmsMessage[] msgs = null;        if (bundle != null)        {            //---retrIEve the SMS message received---            Object[] pdus = (Object[]) bundle.get("pdus");            msgs = new SmsMessage[pdus.length];                        for (int i=0; i<msgs.length; i++){                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                                str += msgs[i].getMessageBody().toString();                str += "\n";                    no = msgs[i].getoriginatingAddress();                //Resolving the contact name from the contacts.                Uri lookupUri = Uri.withAppendedpath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(no));                Cursor c = context.getContentResolver().query(lookupUri, new String[]{ContactsContract.Data.disPLAY_name},null,null,null);                try {                    c.movetoFirst();                 String  displayname = c.getString(0);                String Contactname = displayname;                   Toast.makeText(context, Contactname, Toast.LENGTH_LONG).show();                } catch (Exception e) {                    // Todo: handle exception                }finally{                    c.close();                }            }        }    }}

您必须使用intentfilter在清单中注册此广播接收器

    <receiver androID:name="SMSReceiver">         <intent-filter>              <action androID:name= "androID.provIDer.Telephony.SMS_RECEIVED" />         </intent-filter>     </receiver>

此外,您还必须添加用户权限

<uses-permission androID:name="androID.permission.SEND_SMS"/><uses-permission androID:name="androID.permission.RECEIVE_SMS"/><uses-permission androID:name="androID.permission.READ_CONTACTS"/>
总结

以上是内存溢出为你收集整理的android – 如何在收到短信时获取联系人姓名全部内容,希望文章能够帮你解决android – 如何在收到短信时获取联系人姓名所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1116580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存