доступ к номеру телефона текстового сообщения в Android

Я новичок в Android, я пытаюсь получить номер текстового сообщения, когда приходит новое сообщение, я использую для этого широковещательный приемник. но когда приходит новое сообщение, мой класс «вещательного получателя» не работает. может ли кто-нибудь помочь мне выяснить проблему. давая мой код ниже..

public class MainActivity extends Activity
{
     @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_layout);
    }


     public class MyBroadcastReciever extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String smsnumber = "";         
        if (bundle != null)
        {
            //---retrieve the sender number SMS 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]);                
                smsnumber =  msgs[i].getOriginatingAddress();         
            }
        } 
    }
}

}

я дал тег получения в манифесте.

 <receiver android:name="com.aucupa.iack.MyBroadcastReciever" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

учитывая разрешение использования для получения смс тоже..

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

но когда смс приходит, нет ответа от класса MyBroadcastReciever. Когда я отлаживаю, элемент управления не поступает в класс MyBroadcastReciever. плиз помогите разобраться в проблеме

наконец, я получил ответ от всей вашей помощи, дав свой ответ здесь ..

 public class MainActivity extends Activity
{

  MyBroadcastReciever broadcastreciever = new MyBroadcastReciever();
  static final String SOME_ACTION = "android.provider.Telephony.SMS_RECEIVED";
  IntentFilter intentFilter = new IntentFilter(SOME_ACTION);

  Intent i = new Intent(SOME_ACTION);
 @Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);

sendBroadcast(i);
context.registerReceiver(broadcastreciever, intentFilter);
}


 public class MyBroadcastReciever extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent) 
{
   if (intent.getAction() == "android.provider.Telephony.SMS_RECEIVED"){
    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String smsnumber = "";         
    if (bundle != null)
    {
        //---retrieve the sender number SMS 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]);                
            smsnumber =  msgs[i].getOriginatingAddress();         
        }
    } 
 }
}
}

}

person Jesbin MJ    schedule 23.03.2013    source источник
comment
Какую ошибку на самом деле вы получили?   -  person Linga    schedule 23.03.2013
comment
Вы объявили свой получатель в манифесте?   -  person kyogs    schedule 23.03.2013
comment
@ ling.s, пожалуйста, проверьте мой журнал ошибок. я дал все разрешения в манифесте   -  person Jesbin MJ    schedule 23.03.2013
comment
Пожалуйста, не делайте скриншот logcat, вместо этого скопируйте текст и опубликуйте/отформатируйте его.   -  person JoxTraex    schedule 23.03.2013
comment
опубликуйте свой manifest.xml   -  person Harshid    schedule 23.03.2013


Ответы (5)


В манифесте используйте эту премиссию

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

и

     <receiver android:name="net.app.sms.MessageReceiver" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

попробуй это...

ОТРЕДАКТИРОВАНО

     <receiver android:name="Your PackageName.ClassName" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
person SelvaMariappan    schedule 23.03.2013
comment
почему я должен указать часть получателя в манифесте? внутри тега приложения? что-нибудь еще я должен сделать, как зарегистрировать широковещательный приемник? - person Jesbin MJ; 23.03.2013
comment
внутри тега приложения ‹receiver android:name=Имя вашего класса с пакетом › ‹intent-filter› ‹action android:name=android.provider.Telephony.SMS_RECEIVED /› ‹/intent-filter› ‹/receiver› - person SelvaMariappan; 23.03.2013
comment
я получаю ошибку, например, исключение class not found в net.app.sms.MessageReceiver. - person Jesbin MJ; 23.03.2013
comment
привет в теге получателя Дайте имя вашего класса Не minenet.app.sms.MessageReceiver - это имя моего класса... - person SelvaMariappan; 23.03.2013
comment
У вас не было класса MessageReceiver. У вас есть класс MyBroadcastReciever. Пожалуйста, укажите имя вашего класса в манифесте. - person SelvaMariappan; 23.03.2013
comment
' ‹receiver android:name=YourPackage.YourClassName › ‹intent-filter› ‹action android:name=android.provider.Telephony.SMS_RECEIVED /› ‹/intent-filter› ‹/receiver›' - person SelvaMariappan; 23.03.2013

в вашем MyBroadcastReciever, который расширяет BroadcastReceiver, внутри onReceive() попробуйте этот код

 if (intent.getAction() == android.provider.Telephony.SMS_RECEIVED) {
                Bundle bundle = intent.getExtras();
                if (bundle != null) {
                       // your rest of code

                }
            }
person techroid    schedule 25.03.2013
comment
его получение этой ошибки android.provider.Telephony не может быть преобразовано в переменную - person Jesbin MJ; 25.03.2013
comment
намерение.getAction() == android.provider.Telephony.SMS_RECEIVED - person techroid; 25.03.2013
comment
попробуйте выше поставить его в двойных кавычках - person techroid; 25.03.2013

Я думаю, что проблема связана с регистрацией/отменой регистрации BroadcastReceiver, а также с удаленным объявлением манифеста.

Определите ReceiveMessages как внутренний класс в Activity, который должен прослушивать сообщения от Service.

Затем объявите переменные класса, такие как...

 ReceiveMessages myReceiver = null;
 Boolean myReceiverIsRegistered = false;

В onCreate() используйте myReceiver = new ReceiveMessages();

Затем в onResume()...

if (!myReceiverIsRegistered) {
    registerReceiver(myRecever, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}

...и в onPause()...

if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}

В Service создать и транслировать Intent...

Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);

И это все. Сделайте «действие» уникальным для вашего пакета/приложения, т. е. com.mycompany..., как в моем примере. Это помогает избежать ситуации, когда другие приложения или системные компоненты могут попытаться его обработать.

person Sree    schedule 25.03.2013

Чтобы получить намерения для вашего определенного BroadcastReceiver, вы либо удаляете получателя в AndroidManifest.xml следующим образом:

<receiver android:name="full qualified name of your receiver">
    <action android:name="the action interests you"/>
</receiver>

или зарегистрируйте его с помощью Context.registerReceiver:

Context.registerReceiver(receiver, intentFilter);

В противном случае система не сможет узнать о существовании вашего приемника. Для некоторых особых конфиденциальных намерений (например, SMS) вам также необходимо указать разрешения в AndroidManifest.xml.

person alexhilton    schedule 23.03.2013
comment
как зарегистрироваться в Context.registerReceiver(receiver,intentFilter); что я должен предоставить параметры, вы можете заполнить его моим примером .. - person Jesbin MJ; 25.03.2013

Попробуйте очистить и перестроить код. Иногда нам нужно делать очистку при обновлении кода.

Вы должны зарегистрироваться в двух направлениях.

статические и динамические

дополнительную информацию вы можете найти по этой ссылке.

ИЛИ

Uri uriSMSURI = Uri.parse("content://sms/");
    Cursor cur = mContext.getContentResolver().query(uriSMSURI, null, null,null, null);
    cur.moveToFirst();
       id = cur.getString(cur.getColumnIndex("thread_id"));        
       protocol = cur.getString(cur.getColumnIndex("protocol"));
       Long date=cur.getLong(cur.getColumnIndex("date"));
       type = cur.getInt(cur.getColumnIndex("type"));
       String address=cur.getString(cur.getColumnIndex("address"));

       System.out.println("READING LOG...."+"\n thread_id:"+id+"\n protocol:"+protocol+"\n type:"+type+"\n address"+address);
           if(protocol==null && (type==2 || type==4 || type==6)){
             Log.i("======TEST====", "MESSAGE SENT.......number:"+address);
           }else if(protocol!=null && type==1){               
                Log.i("======TEST====", "MESSAGE RECEIVE.......number:"+address);
           }else{
            //something message
           }

Попробуй это.

person Harshid    schedule 23.03.2013