【问题标题】:How to get contact name when receiving SMS接收短信时如何获取联系人姓名
【发布时间】:2015-01-14 15:40:21
【问题描述】:

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

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答案中的代码。

现在应用在收到短信时崩溃。

【问题讨论】:

    标签: android sms broadcastreceiver


    【解决方案1】:

    试试这个代码

    在广播接收器中

     public class SMSReceiver  extends BroadcastReceiver{
    
     String str = "";    
     String no = "";
    @Override
    public 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"/>
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2016-05-07
      • 2012-01-11
      • 2012-10-11
      相关资源
      最近更新 更多