您好我正在开发一个完全基于短信的应用程序。我可以成功发送到所需的号码,但我的问题是,即使我使用代码通过intentfilter和待定意图获取通知,我也没有收到发送和发送通知。 发送短信和接收通知的代码是在扩展广播接收器的类(SmsHandling.java)内完成的。我的程序代码在这里..
public class SmsHandling extends BroadcastReceiver{
IntentFilter sendFilter,deliveredFilter;
Context mcontext;
String result="got it";
public SmsHandling(Mobile mobile) {
// TODO Auto-generated constructor stub
mcontext=mobile;
}
String sendSms(String num,String messege){
Log.d("inside method", "getting");
String SENT="SMS_SENT";
String DELIVERED="SMS_DELIVERED";
sendFilter=new IntentFilter("SMS_SEND");
deliveredFilter=new IntentFilter("SMS_DELIVERED");
PendingIntent sendPI=PendingIntent.getBroadcast(mcontext, 0, new Intent(SENT), 0);
PendingIntent deliveredPI=PendingIntent.getBroadcast(mcontext, 0, new Intent(DELIVERED), 0);
mcontext.registerReceiver(sendingSms, sendFilter);
mcontext.registerReceiver(deliveredSms, deliveredFilter);
Log.d("inside method 2", "getting 2");
SmsManager sms=SmsManager.getDefault();
sms.sendTextMessage(num, null, messege, null, null);
Log.d("inside method 3", "getting 3");
return result;
}
BroadcastReceiver sendingSms=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "Sms Send", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "Generic Errors", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(context, "No Service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(context, "Null pdu", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "Error Radio", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
BroadcastReceiver deliveredSms=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "Sms Delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(context, "Sms Failed", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
public void unregisterreciever(){
mcontext.unregisterReceiver(sendingSms);
mcontext.unregisterReceiver(deliveredSms);
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.print("Recieved : "+intent.getAction());
}
}
我是否需要做更多像intentfilter而不是在清单文件中声明接收器的事情我的清单文件如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.rrm"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.BROADCAST_SMS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.rrm.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Mobile"
android:label="@string/app_name"></activity>
<activity
android:name=".Dth"
android:label="@string/app_name"></activity>
<activity
android:name=".Datacard"
android:label="@string/app_name"></activity>
<activity
android:name=".Check"
android:label="@string/app_name"></activity>
<activity
android:name=".Register"
android:label="@string/app_name"></activity>
<receiver
android:name=".SmsHandling"></receiver>
</application>
</manifest>
而且我也没有正确理解Intent过滤器可以解释为什么在清单文件中使用它。 并且还帮我解决了上述问题
答案 0 :(得分:0)
显然,这不是您想要听到的内容,但Android并非旨在允许第三方应用程序相互干扰或超越用户的自由选择。
它没有提供&#34; hook&#34;用于硬拦截基本功能的机制类型,缺少修改安装在设备上的Android本身的构建。
设备管理员界面不包含任何用于调节短信的内容。
是的,偶尔人们使用各种各样的产品制作产品&#34; hack&#34;在某种程度上完成这些事情的方法,但它们与平台的设计相悖,因此当各种&#34; bug修复时,它们不可靠或可能会破坏。对android进行了类型改进。或者它们的范围有限,例如更换主屏幕,从而限制易于启动的内容 - 但只要主屏幕应用程序保持选中状态,并且无法管理其他意图来源。
你可能会发现一个足够吸引人的想法,你决定与它一起运行,但请记住,除非它是未来的API介绍用于做这种事情,你很可能会利用监督该平台的设计很可能很快就会得到纠正。
你必须做这样的事情:
在手机上缓存所有邮件的哈希码 注册content:// sms的内容观察者 在观察者的onChange方法中,枚举所有消息以检查它是否在高速缓存中,如果没有,则消息刚刚发送出去。 祝你的项目好运: - )
编辑:md5方法 您可以使用(到达日期+消息)文本来获取唯一的md5输出。
private String md5(String in) {
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
digest.reset();
digest.update(in.getBytes());
byte[] a = digest.digest();
int len = a.length;
StringBuilder sb = new StringBuilder(len << 1);
for (int i = 0; i < len; i++) {
sb.append(Character.forDigit((a[i] & 0xf0) >> 4, 16));
sb.append(Character.forDigit(a[i] & 0x0f, 16));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) { e.printStackTrace(); }
return null;
}
更新清单,为您的应用提供接收SMS的权限(WRITE_SMS,READ_SMS,RECEIVE_SMS) 请勿使用接收器意图过滤器更新清单! (每个示例代码在线似乎都有) 在您的服务中,在Service类
中创建一个嵌套的BroadcastReceiver类private class SMSreceiver extends BroadcastReceiver
{
private final String TAG = this.getClass().getSimpleName();
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
String strMessage = "";
if ( extras != null )
{
Object[] smsextras = (Object[]) extras.get( "pdus" );
for ( int i = 0; i < smsextras.length; i++ )
{
SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);
String strMsgBody = smsmsg.getMessageBody().toString();
String strMsgSrc = smsmsg.getOriginatingAddress();
strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;
Log.i(TAG, strMessage);
}
}
}
}
在您的Service类中,注册以接收android.provider.Telephony.SMS_RECEIVED意图过滤器:
public class ServiceCommunicator extends Service
{
private SMSreceiver mSMSreceiver;
private IntentFilter mIntentFilter;
@Override
public void onCreate()
{
super.onCreate();
//SMS event receiver
mSMSreceiver = new SMSreceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSMSreceiver, mIntentFilter);
}
@Override
public void onDestroy()
{
super.onDestroy();
// Unregister the SMS receiver
unregisterReceiver(mSMSreceiver);
}
}
那就是它!
注意:请您知道为什么我没有从单独的BroadcastReceiver类中绑定到我的服务 - 它不起作用,因为bindService()不可用。
答案 1 :(得分:0)
更改此行
sms.sendTextMessage(num, null, messege, null, null);
到
sms.sendTextMessage(num, null, messege, sendPI, deliverdPI);
答案 2 :(得分:0)
事实证明,您无法使用getResultCode()来确定SMS是否真的已经发送。你必须解析pdu。 Android可以解析它,但您必须解释状态代码。根据它是GSM还是CDMA,&#34;交付确定&#34;状态代码为0或2。
有关详细信息,请参阅: Android SMS delivery notification on failure: false positive