2013-03-23 105 views
2

我在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> 

给出过recieving短信的使用许可..

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

但是当短信来没有从MyBroadcastReciever响应class.when我调试控制不涉及到MyBroadcastReciever类。 PLZ帮我找出问题

最后我得到了所有你的帮助的答案,这里给我的答案..

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

} 
+0

实际收到的错误是什么? – 2013-03-23 06:43:03

+0

你有清单中声明你的接收器吗? – kyogs 2013-03-23 06:46:51

+0

@ ling.s plz检查我的错误日志。我已经给予清单 – 2013-03-23 07:03:39

回答

0

在清单 使用这种Premission

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

试试这个...

EDITED

 <receiver android:name="Your PackageName.ClassName" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
+0

我应该在清单中提供reciever部分吗?应用程序标签内?我应该做什么喜欢像这样注册广播接收者? – 2013-03-23 06:49:09

+0

里面的应用程序标记 SelvaMariappan 2013-03-23 06:51:04

+0

工作与否如果工作意味着请您打勾回答 – SelvaMariappan 2013-03-23 07:04:49

0

要接收意图为您定义的广播接收器,你要么delcare接收器在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中进行delcare权限。

+0

如何注册Context.registerReceiver(接收器,intentFilter);我应该提供什么参数,你可以用我的例子填充它.. – 2013-03-25 04:46:20

0

尝试清理并重新构建您的代码。有时我们需要在代码更新上进行清理。

你必须注册双向。

静态和动态

的更多信息,你可以看到这个link

OR

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 
      } 

试试这个。

2

在MyBroadcastReciever延伸广播接收器,里面的onReceive()试试这个代码

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

       } 
      } 
+0

它得到这个错误android.provider.Telephony不能被解析为变量 – 2013-03-25 05:10:08

+0

intent.getAction()==“android.provider.Telephony.SMS_RECEIVED” – techroid 2013-03-25 05:33:27

+0

请尝试上面的双引号 – techroid 2013-03-25 05:33:49

1

我认为这个问题是与注册/注销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...就像我的例子。这有助于避免其他应用程序或系统组件可能尝试处理它的情况。

相关问题