如何获取邮件的发送和传递通知

时间:2013-10-09 10:06:56

标签: android

您好我正在开发一个完全基于短信的应用程序。我可以成功发送到所需的号码,但我的问题是,即使我使用代码通过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过滤器可以解释为什么在清单文件中使用它。 并且还帮我解决了上述问题

3 个答案:

答案 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);

请参阅reference for sendTextMessage here

答案 2 :(得分:0)

事实证明,您无法使用getResultCode()来确定SMS是否真的已经发送。你必须解析pdu。 Android可以解析它,但您必须解释状态代码。根据它是GSM还是CDMA,&#34;交付确定&#34;状态代码为0或2。

有关详细信息,请参阅: Android SMS delivery notification on failure: false positive