本文介绍了如何接收短信时,你得到的联系人姓名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的code接收短信,我试图让联系人姓名。

I have the following code to receive an SMS and I am trying to get the contact name.

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();
        }
    }
}

这是我补充说,导致我的应用程序崩溃code:

This is the code that I have added that cause my app to crash:

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();

我只是修改了code从这个link.

现在应用程序崩溃接收短信时。

Now the app crashes when receiving an SMS.

推荐答案

试试这个code

在广播接收器

 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

You have to register this broadcast receiver in the manifest with intentfilter

    <receiver android:name="SMSReceiver">

         <intent-filter> 
             <action android:name= "android.provider.Telephony.SMS_RECEIVED" />
         </intent-filter> 

    </receiver>

你也必须添加用户权限像

ALso you have to add user permission like

<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

这篇关于如何接收短信时,你得到的联系人姓名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-13 19:56