Intereting Posts
Возвращаемые значения Java File.lastModified при изменении часового пояса? Не удается открыть файл, загруженный через диспетчер загрузки api Обнаруживать качели слева и справа в Android (onFling и OnGestureListener) NEW_OUTGOING_CALL не вызывается на Samsung Galaxy S Android конвертирует местоположение CID в координаты Проверьте, какой язык работает в Android Android L ActionBarActivity с использованием Feinstein SldingMenu и AppCompat v21 отключен в нижней части экрана Сообщение тоста от широковещательного приемника Переключение между большим представлением и нормальным представлением для уведомления о программном обеспечении Android с помощью кнопки действия уведомления Android: обратные вызовы с компонентом WebView? Экран Android Splash для класса «Приложение» Видеоролик YouTube не открывается в webView Как я могу сделать фигурные края на изображении на андроиде? Как настроить fillColor, StrokeWidth и StrokeColor для векторного рисования программно в Android Ящик навигации справа налево с помощью v7 ActionBarDrawerToggle

Как получить контактное имя при получении SMS-сообщений

У меня есть следующий код для получения SMS, и я пытаюсь получить имя контакта.

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

Я только что изменил код из ответа на эту ссылку .

Теперь приложение вылетает при получении SMS.

Попробуйте этот код

В широковещательном приемнике

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

Вы должны зарегистрировать этот широковещательный приемник в манифесте с помощью намеренного фильтра

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