android4.0 以后BroadcastReceiver 无法连接 系统短信。

素颜淡漠 发布于 2013/03/29 13:36
阅读 2K+
收藏 0

收藏!数据建模最全知识体系解读!>>>

自己写了一个拦截短信的功能   android4.0 以后拦截不到系统的广播了 ,但是自己发送的广播能拦截。 求大牛指定

这是activity注册类

package com.example.smsreceiver;


import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;


public class MainActivity extends Activity implements OnClickListener{
public EditText edt_custom;
public Button btn_custom;
public Button btn_regsms;
public Button btn_unregsms;
public Button btn_regcall;
public Button btn_unregcall;
public SMSReceiver sms=null;
public static final String SMS_RECEIVE_ACTION="android.provider.Telephony.SMS_RECEIVED";
public static final String CUSTOM_RECEIVE_ACTION="android.testsms.SMSRECRIVED";

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

edt_custom=(EditText)findViewById(R.id.edt_custom);
btn_custom=(Button)findViewById(R.id.btn_custom);
btn_regsms=(Button)findViewById(R.id.btn_regsms);
btn_unregsms=(Button)findViewById(R.id.btn_unregsms);
btn_regcall=(Button)findViewById(R.id.btn_regcall);
btn_unregcall=(Button)findViewById(R.id.btn_unregcall);


btn_custom.setOnClickListener(this);
btn_regsms.setOnClickListener(this);
btn_unregsms.setOnClickListener(this);
btn_regcall.setOnClickListener(this);
btn_unregcall.setOnClickListener(this);
}







public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, 1, 1, "退出");
return super.onCreateOptionsMenu(menu);
}




public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==1){
finish();
}
return super.onOptionsItemSelected(item);
}










public void onClick(View v) {
if(v==btn_custom){
Intent ii=new Intent();
ii.setAction(CUSTOM_RECEIVE_ACTION);
ii.putExtra("key", "123");
sendBroadcast(ii);
}else if(v==btn_regsms){
if(sms==null){
sms=new SMSReceiver();
IntentFilter filter=new IntentFilter(CUSTOM_RECEIVE_ACTION);
filter.addAction(SMS_RECEIVE_ACTION);
registerReceiver(sms, filter, "android.permission.RECEIVE_SMS", null);
Toast.makeText(getApplicationContext(), "SMSReceiver 注册成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(), "SMSReceiver 已经注册过了", Toast.LENGTH_LONG).show();
}
}else if(v==btn_unregsms){
if(sms!=null){
unregisterReceiver(sms);
sms=null;
Toast.makeText(getApplicationContext(), "SMSReceiver 注销成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(), "SMSReceiver 还没注册", Toast.LENGTH_LONG).show();
}
}else if(v==btn_regcall){

}else if(v==btn_unregcall){

}
}


}




这是 广播接受类

package com.example.smsreceiver;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class SMSReceiver extends BroadcastReceiver{


public SMSReceiver(){
System.out.println("SMSReceiver init");
Log.i("SMSReceiver", "init");
}

public void onReceive(Context context, Intent intent) {
System.out.println("SMSReceiver onReceive");
Log.i("SMSReceiver", "onReceive");

}


}


 


权限

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



加载中
0
黑狗
黑狗

没细看。。。。但是拦截短信的话,除了通过广播拦截,还可以通过provider。

原理应该是观察者模式,建议你再插下资料

0
素颜淡漠

引用来自“黑狗”的答案

没细看。。。。但是拦截短信的话,除了通过广播拦截,还可以通过provider。

原理应该是观察者模式,建议你再插下资料

你说的provider 应该是查询短信的数据库记录,我用broadcastreceiver是想在短信过来的时候 过滤掉没有必要的短信不给用户看,我查了快2天记录 都没有一个正确解释,百度,谷歌都是别人复制来复制去的答案,都是以前2.3以前的版本,现在4.0以后对编写都加入了很多严格控制,这里的广播对自己编写的,或则如电量等不需要权限(不是隐私)的广播都能接受,可是如短信,通话等涉及隐私的,我编写的都broadcastreceiver都接受不到系统广播,要加的权限都加入了,可是还是没有反应,求大牛贴一段可以在4.0以后运行的代码,小弟不胜感激。。。
0
tonyd
tonyd

引用来自“素颜淡漠”的答案

引用来自“黑狗”的答案

没细看。。。。但是拦截短信的话,除了通过广播拦截,还可以通过provider。

原理应该是观察者模式,建议你再插下资料

你说的provider 应该是查询短信的数据库记录,我用broadcastreceiver是想在短信过来的时候 过滤掉没有必要的短信不给用户看,我查了快2天记录 都没有一个正确解释,百度,谷歌都是别人复制来复制去的答案,都是以前2.3以前的版本,现在4.0以后对编写都加入了很多严格控制,这里的广播对自己编写的,或则如电量等不需要权限(不是隐私)的广播都能接受,可是如短信,通话等涉及隐私的,我编写的都broadcastreceiver都接受不到系统广播,要加的权限都加入了,可是还是没有反应,求大牛贴一段可以在4.0以后运行的代码,小弟不胜感激。。。
解决了没有,我也碰到了这个问题了
0
我是路吃
我是路吃
不知道楼主解决了这个问题没??最近正烦着这个,,,如果解决了还请指教~~
返回顶部
顶部