在android中访问短信的电话号码

在android中访问短信的电话号码,android,android-intent,android-broadcast,Android,Android Intent,Android Broadcast,我是android的新手,我试图在收到新消息时获取文本消息的号码,我使用广播接收器。但是,当一条新消息传来时,我的“广播接收器”类无法工作。谁能帮我找出这个问题吗。在下面给出我的代码 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceStat

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

}
公共类MainActivity扩展活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test_布局);
}
公共类MyBroadcastReceiver扩展了BroadcastReceiver
{
@凌驾
公共void onReceive(上下文、意图)
{
Bundle=intent.getExtras();
SmsMessage[]msgs=null;
字符串smsnumber=“”;
if(bundle!=null)
{
//---检索收到的短信的发件人号码---
Object[]pdus=(Object[])bundle.get(“pdus”);
msgs=新SMS消息[PDU.length];
对于清单中的(int i=0;i)
使用这个前置任务

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


试试这个

已编辑

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

要接收定义的BroadcastReceiver的意图,您可以在AndroidManifest.xml中删除接收器,如下所示:

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

否则,系统无法知道您的接收器存在。对于某些特殊的敏感意图(如SMS),您还需要删除AndroidManifest.xml中的权限。

尝试清理和重建代码。有时,我们需要在更新代码时进行清理

你必须双向注册

静态和动态

更多信息,你可以看到这一点

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
           }

试试这个。

在扩展了BroadcastReceiver的MyBroadcastReceiver中,在onReceive()内部,试试下面的代码

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

                }
            }

我认为问题在于注册/取消注册
BroadcastReceiver
,以及删除清单声明

ReceiveMessages
定义为
活动
中的一个内部类,该类需要侦听来自
服务的消息

然后,声明类变量,例如

 ReceiveMessages myReceiver = null;
 Boolean myReceiverIsRegistered = false;
onCreate()
中使用
myReceiver=newreceivemessages();

然后在
onResume()

if (!myReceiverIsRegistered) {
    registerReceiver(myRecever, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);
…并在
onPause()中

if (!myReceiverIsRegistered) {
    registerReceiver(myRecever, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);
服务中
创建并广播
意图

if (!myReceiverIsRegistered) {
    registerReceiver(myRecever, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}
if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}
Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);

仅此而已。使“操作”对您的软件包/应用程序是唯一的,例如,
com.mycompany…
,如我的示例所示。这有助于避免出现其他应用程序或系统组件可能试图处理它的情况。

您实际收到的错误是什么?您是否在清单中声明了收件人?@ling.s plz检查我的错误日志。我鉴于清单中的所有权限,请不要拍摄logcat的屏幕截图,而是复制文本和post/格式。post your manifest.xmlwhr我应该在清单中提供接收器部分吗?在应用程序标记内?我还应该像这样在应用程序标记内注册广播接收器吗我在net.app.sms.MessageReceiver.hello的receiver标记中管理类未找到异常等错误给你的类名不是我的“net.app.sms.MessageReceiver是我的类名…你没有MessageReceiver类你有MyBroadcastReceiver类请在清单中提及你的类名如何注册到Context.registerReceiver(receiver,intentFilter);我应该提供什么参数,你能用我的示例来填充吗..它得到这个错误android.provider.Telephony无法解析为variableintent.getAction()==“android.provider.Telephony.SMS_RECEIVED”请在上面用双引号括起来