2013-04-18 138 views
3

我有以下代碼可以接收短信,我正在嘗試獲取聯繫人姓名。如何在接收短信時獲取聯繫人姓名

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

現在應用程序在收到短信時崩潰。

回答

12

試試這個代碼

在廣播接收機

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"/> 
+0

5.1.1棒棒糖很棒。謝謝 – raddevus 2017-04-14 20:01:44

相關問題