我有以下代码来接收短信,我正在尝试获取联系人姓名.
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 – 如何在收到短信时获取联系人姓名所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)