访问Android中的短信的电话号码
我在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();
}
}
}
}
}
}
在清单 使用这种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>
我应该在清单中提供reciever部分吗?应用程序标签内?我应该做什么喜欢像这样注册广播接收者? – 2013-03-23 06:49:09
里面的应用程序标记
工作与否如果工作意味着请您打勾回答 – SelvaMariappan 2013-03-23 07:04:49
要接收意图为您定义的广播接收器,你要么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权限。
如何注册Context.registerReceiver(接收器,intentFilter);我应该提供什么参数,你可以用我的例子填充它.. – 2013-03-25 04:46:20
尝试清理并重新构建您的代码。有时我们需要在代码更新上进行清理。
你必须注册双向。
静态和动态
的更多信息,你可以看到这个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
}
试试这个。
在MyBroadcastReciever延伸广播接收器,里面的onReceive()试试这个代码
if (intent.getAction() == android.provider.Telephony.SMS_RECEIVED) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
// your rest of code
}
}
我认为这个问题是与注册/注销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...
就像我的例子。这有助于避免其他应用程序或系统组件可能尝试处理它的情况。
实际收到的错误是什么? – 2013-03-23 06:43:03
你有清单中声明你的接收器吗? – kyogs 2013-03-23 06:46:51
@ ling.s plz检查我的错误日志。我已经给予清单 – 2013-03-23 07:03:39